跳转至内容

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 是非标准的,因此它们因编译器而异。

华夏公益教科书