C 语言入门/C 预处理器指令
外观
< C 语言入门
我们已经看到了“#include”和“#define”预处理器指令。C 预处理器还支持其他一些指令。所有这些指令都以“#”开头,以便与 C 语言命令区分开来。
正如第一章所述,“#include”指令允许将其他文件的内容包含在 C 源代码中
#include <stdio.h>
注意,标准头文件“stdio.h”用尖括号指定。这告诉 C 预处理器,该文件可以在 C 编译器为头文件指定的标准目录中找到。要包含来自非标准目录的文件,请使用双引号
#include "\home\mydefs.h"
包含文件可以嵌套。它们可以调用其他包含文件。
同样在第一章中已经解释过,“#define”指令可以用来指定符号以替换特定的文本字符串
#define PI 3.141592654
...
a = PI * b;
在这种情况下,预处理器在整个源代码清单中对 PI 进行简单的文本替换。C 编译器本身不仅不知道 PI 是什么,而且它甚至从未见过它。
“#define”指令可以用来创建类似函数的宏,这些宏允许参数替换。例如
#define ABS(value) ( (value) >=0 ? (value) : -(value) )
然后,这个宏可以在表达式中使用,如下所示
printf( "Absolute value of x = %d\n", ABS(x) );
注意,这种类似函数的宏的行为与真正的函数不完全相同。例如,假设“x++”是上面宏的参数
val = ABS(x++);
这会导致“x”被增加两次,因为“x++”在表达式中被替换了两次
val = ( (x++) >=0 ? (x++) : -(x++) )
除了“#define”指令外,还有一个“#undef”指令,它取消定义之前定义的常量
#undef PI
C 预处理器支持的另一个功能是条件编译,使用以下指令
#if
#else
#elif
#endif
这些指令可以测试定义的常量的值,以定义哪些代码块传递给 C 编译器本身
#if WIN == 1
#include "WIN.H"
#elif MAC == 1
#include "MAC.H"
#else
#include "LINUX.H"
#endif
如果需要,这些指令可以嵌套。"#if" 和 "#elif" 还可以测试常量是否已定义,使用“defined”运算符
#if defined( DEBUG )
printf( "Debug mode!\n");
#endif
—或者测试常量是否未定义
#if !defined( DEBUG )
printf( "Not debug mode!\n");
#endif
最后,还有一个“#pragma”指令,根据定义,它是用来实现非标准 C 语言的机器特定命令的万能指令。由于 pragmas 是非标准的,因此它们因编译器而异。