cpp 命令
用途
完成 C 语言源文件上的文件包含和宏置换。
语法
/usr/ccs/lib/cpp [ -C ] [ -P ] [ -qDBCS ] [ -IDirectory ] [ -UName ] [ -DName [=Defin ition ]] [ -qlanglvl=Language ] [ InFile ] [ OutFile ]
描述
cpp 命令完成 C 语言源文件上的文件包含和宏置换。 它读 InFile 并且写到 OutFile (缺省为标准输入和标准输出)。
cpp 命令被设计用来符合由文档“Draft American National Standard for Information Systems Systems - Programming Language C”(X3J11/88-159) 定义的 C 语言预处理伪指令和指令。
cpp 程序识别下列的特殊名字:
| 项 | 描述 |
|---|---|
| __行 | 当前行号。 |
| 日期 | 源文件的转化日期。 |
| 时间 | 源文件的转化时间。 |
| __STDC____。 | 指示一个一致的实现。 |
| __文件__ | 当前文件名。 |
| __STR__号 | 指出编译器将为某些字符串函数(在 /usr/include/string.h 中定义)生成直接插入的代码。 |
| __数学__ | 指出编译器将为某些数学函数(在 /usr/include/math.h 中定义)生成直接插入的代码。 |
| __国家标准__ | 指出 langlvl 被设定等于 ANSI。 |
| __SAA__ | 指示 langlvl 设置为等于 SAA。 |
| __SAA_L2__ | 指出 langlvl 被设定等于 SAAL2。 |
| __EXTENDED__ | 指出 langlvl 被设定等于 extended。 |
| __TIMESTAMP____(时间戳 | 指出源文件最近修改的日期和时间。 |
所有 cpp 伪指令行必须以一个 #(磅符号)开始。 这些伪指令是:
| 项 | 描述 |
|---|---|
| #define 名称 TokenString | 用 TokenString 取代随后的 Name 实例。 |
| #define 名称(自变量, ... ,自变量) TokenString | 把后续的 Name (Argument, . . . ,Argument) 序列的实例替换为 TokenString,TokenString 中出现的每个 Argument 都被逗号分隔的列表中相应的记号替换。 注意,Name 和左括号之间不能有任何空格。 |
| #undef 名称 | 从这点开始忽略任何 Name 定义。 |
| #include "文件" 或 #include <文件> | 在这点包含 File 的内容,这个文件将被
cpp 处理。 如果您给 File 加上 " "(双引号), cpp 命令首先在 InFile 目录中搜索,然后在以 -I 标志指定的目录中搜索,最后在一个标准列表上的目录中搜索。 If you use the <文件> notation, the 共产党 command searches for 文件 only in the standard directories. 它不搜索 InFile 驻留的目录。 |
| #line Number ["文件"] | 使得实现表现得好像接下去的源行序列以具有用 Number 定义的行号的源行开始。 如果提供 File,那么假定的文件名被改为 File。 |
| #error TokenString | 产生一个包含 TokenString 的诊断消息。 |
| #pragma TokenString | 编译器的已定义实现的指令。 |
| #endif | 结束以一个测试伪指令( #if、#ifdef 或 #ifndef)开始的行部分。 每个测试伪指令都必须有一个相匹配的 #endif。 |
| #ifdef 名称 | 把随后的行放到输出中,仅当: Name 已经由先前的 #define 定义 或 Name 已经由 -D 标志定义, 或 Name 是一个 cpp 命令可识别的特殊名称, 和 Name 尚未由插入的 #undef 取消定义, 或 Name 尚未由 -U 标志取消定义。 |
| #ifndef 名称 | 把随后的行放到输出中,仅当: Name 从没有被先前的 #define 定义, 和 Name 不是一个 cpp 命令可识别的特殊名称, 或 Name 已经被先前的一个 #define 定义,但是它已经被一个插入的 #undef 取消定义, 或 Name 是一个 cpp 命令可识别的特殊名称,但是它已经被 -U 标志取消定义。 |
| #if 表达式 | 把随后的行放到输出中,仅当 Expression 求值不是零。 所有二进制非赋值 C 运算符,即?: 运算符以及一元运算符在 Expression中是合法的。 运算符的优先顺序和 C 语言中定义的相同。 还有一个一元运算符 defined
,它可以在 Expression 中以两种形式使用:
|
| #elif 表达式 | 把随后的行放到输出中,只要前面的 #if 或 #elif 伪指令中的表达式求值为 false 或未定义,并且这个 Expression 求值为 true。 |
| #else | 把随后的行放到输出中,只要前面的 #if 或 #elif 伪指令中的表达式求值为 false 或未定义(因此在 #if 之后,在 #else 之前的行都被忽略)。 每个测试伪指令条件都被依次检查。 如果它求值为 false (0),它控制的分组被跳过。 只通过确定伪指令的名字来处理伪指令以便于跟踪嵌套条件的层次;组中有其他的预处理记号,伪指令的其余预处理记号被忽略。 只有控制条件求值为 true(非零)的第一组被处理。 如果没有一个控制条件求值为 true,并且有 #else 伪指令,那么由 #else 控制的那组被处理;缺少一个 #else 伪指令,到 #endif 为止所有的组都被跳过。 |
标志
| 项 | 描述 |
|---|---|
| -C | 从源文件复制 C 语言注释到输出文件。 如果您省略了此标志,cpp 命令除去除了 cpp 伪指令行中的所有 C 语言注释。 |
| -D名称[=定义] | 定义 #define 伪指令中的 Name 。 Definition 的缺省值是 1。 |
| -I目录 | 首先查找 Directory,再查找针对 #include 文件的标准列表上的目录中不是以 /(正斜杠)开始的名字。 请参阅先前的关于 #include 的讨论。 |
| -P | 预处理输入而不为 C 编译器的下一趟运行产生行控制信息。 |
| -q DBCS | 指定双字节字符集方式。 |
| -U名称 | 除去 Name的任何初始定义,其中 Name 是由预处理器预定义的符号 (四个预处理器方式指示符除外: __ANSI__, __EXTENDED__, __SAA__和 __SAA_L2__)。 在 ANSI 方式下无法识别此标志。 |
| -qlanglvl=语言 | 为处理选择一个语言级别。 语言 可以是 ANSI , SAA, SAAL2或扩展语言。 缺省是扩展。注:当 Language 是扩展时, _NO_PROTO 不被自动定义。 可以使用 -D 选项完成这些定义,这个选项在 /etc/xlc.cfg 文件中。 |
示例
- 要显示预处理器发送给 C 编译器的文本,请输入:
此预处理pgm.c并在工作站上显示生成的文本。 当在宏定义中寻找错误时,您也许会想看看预处理器的输出。/usr/ccs/lib/cpp pgm.c - 要创建包含更多可读的预处理文本的文件,请输入:
此预处理pgm.c并将结果存储在pgm.i. 它省略了用于 C 编译器的行编号信息 (-P) ,并包含程序注释 (-C)./usr/ccs/lib/cpp -P -C pgm.c pgm.i - 要预定义宏标识,请输入:
这定义了BUFFERSIZE具有值512和DEBUG具有值1在预处理之前。/usr/ccs/lib/cpp -DBUFFERSIZE=512 -DDEBUG pgm.c pgm.i - 要使用位于非标准目录中的 #include 文件,请输入:
这将在当前目录中查找带引号的 #include 文件,然后在/home/jim/include,然后在标准目录中。 它的外观/home/jim/include角括号的 #include 文件 (< >),然后在标准目录中。/usr/ccs/lib/cpp -I/home/jim/include pgm.c - 要使用 ANSI 定义进行预处理,请输入:
/usr/ccs/lib/cpp -qlanglvl=ansi pgm.c
文件
| 项 | 描述 |
|---|---|
| /usr/include | #include 文件的标准目录。 |