C预处理器#if表达式

Roh*_*ain 11 c c-preprocessor

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

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

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;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 25

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

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

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

#if c==1
#define check(a) (a==1)?a:5
#define TABLE_SIZE 100
#endif
Run Code Online (Sandbox Code Playgroud)

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

#if 0==1
Run Code Online (Sandbox Code Playgroud)

这当然是假的.

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

#define C 1

#if C==1
#define check(a) (a==1)?a:5
#define TABLE_SIZE 100
#endif
Run Code Online (Sandbox Code Playgroud)

(请注意,我还将宏名称设置为大写,以符合宏名称的约定.)


nmi*_*els 5

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

#define C 1
Run Code Online (Sandbox Code Playgroud)

测试按照您的方式进行:

#if C == 1
Run Code Online (Sandbox Code Playgroud)

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

请注意,约定是在ALL_CAPS.