C预处理器#if表达式

我对可以与C语言中的#IF预处理器一起使用的表达式类型感到困惑。 我尝试了以下代码,但它无法正常工作。 请解释并提供可与预处理器一起使用的表达式的示例。

#include #include #include int c=1; #if c==1 #define check(a) (a==1)?a:5 #define TABLE_SIZE 100 #endif int main() { int a = 0, b; printf("a = %d\n", a); b = check(a); printf("a = %d %d\n", a, TABLE_SIZE); system("PAUSE"); return 0; } 

预处理器不能在表达式中使用C程序中的变量 – 它只能作用于预处理器宏。 因此,当您尝试在预处理器中使用c时,您无法获得预期的结果。

但是,您也不会收到错误,因为当预处理器尝试评估未定义为宏的标识符时,它会将标识符视为值为零。

所以当你点击这个片段时:

 #if c==1 #define check(a) (a==1)?a:5 #define TABLE_SIZE 100 #endif 

预处理器使用的c与C程序中的变量c无关。 预处理器查看是否有为c定义的宏。 由于没有,它会评估以下表达式:

 #if 0==1 

这当然是假的。

由于您似乎没有在程序中使用变量c ,因此您可以执行以下操作以获得与您尝试的行为一致的行为:

 #define C 1 #if C==1 #define check(a) (a==1)?a:5 #define TABLE_SIZE 100 #endif 

(请注意,我还使宏名称大写,以符合宏名称的约定。)

在完成任何编译之前,预处理器在文本上运行。 它不知道如何解析C.你可能想要什么而不是int c=1;

 #define C 1 

并且测试按照您的方式工作:

 #if C == 1 

这里的关键是这都是编译时之前定义的。 预处理器不关心C变量,当然也不关心它们的值是什么。

请注意,约定是在ALL_CAPS定义预处理器宏名称。

在你的例子中, c是一个编译器生成的符号, c运行时没有值,而预处理器表达式在构建时被评估(事实上,正如在编译器处理代码之前的名称所示),所以只能在pre-在构建时存在的处理器符号。

此外,这样的表达式必须是编译时常数 ,或者实际上更精确地是预处理时间常数 ,因为例如sizeof(...)类的编译器常量表达式也未在预处理期间定义。

预处理器不评估C变量。 它在编译源代码之前对其进行“预处理”,因此具有自己的语言。 而是这样做:

 #define c 1 #if c==1 #define check(a) (a==1)?a:5 #define TABLE_SIZE 100 #endif ...