C预处理程序#if表达式

对于在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;
}
    
已邀请:
        预处理器不能在表达式中使用C程序中的变量-它只能对预处理器宏起作用。因此,当您尝试在预处理器中使用ѭ1时,您将无法获得预期的结果。 但是,您也不会收到错误,因为当预处理器尝试评估未定义为宏的标识符时,它将该标识符视为值为零。 因此,当您点击以下代码段时:
#if c==1
#define check(a) (a==1)?a:5
#define TABLE_SIZE 100
#endif
预处理器使用的“ 1”与C程序中的变量“ 1”无关。预处理器看是否有一个为ѭ1定义的宏。由于没有,它将计算以下表达式:
#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变量,当然也不关心它们的值是什么。 注意,约定是在have12ѭ中定义预处理器宏名称。     
        在您的示例中,“ 1”是编译器生成的符号,“ 1”在运行时之前没有值,而预处理器表达式是在构建时求值的(实际上,顾名思义,编译器在处理代码之前就暗示了这一点),因此只能在预编译器上运行在构建时确实存在的处理器符号。 而且,这样的表达式必须是编译时间常数,或者实际上更确切地说是预处理时间常数,因为在预处理过程中也没有定义诸如
sizeof(...)
之类的编译器常数表达式。     
        预处理器不计算C变量。它在编译之前对源代码进行“预处理”,因此具有自己的语言。而是这样做:
#define c 1

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

要回复问题请先登录注册