没有令牌的#define IDENTIFIER

以下陈述的含义是什么:

#define FAHAD 

我熟悉这样的陈述:

 #define FAHAD 1 

但是没有令牌的#define语句是什么意思呢? 它是否类似于常量定义?

定义没有值的常量作为预处理器的标志,可以像这样使用:

 #define MY_FLAG #ifdef MY_FLAG /* If we defined MY_FLAG, we want this to be compiled */ #else /* We did not define MY_FLAG, we want this to be compiled instead */ #endif 

任何#define导致用替换标记替换原始标识符。 如果没有替换令牌,则替换为空:

 #define DEF_A "some stuff" #define DEF_B 42 #define DEF_C printf("%s is %d\n", DEF_A, DEF_B DEF_C); 

扩展为:

 printf("%s is %d\n", "some stuff", 42 ); 

我在42和之间放置一个空格来表示DEF_C扩展到的“无”,但至少就语言而言,预处理器的输出只是一个令牌流。 (实际的编译器通常会让你看到预处理器的输出。这里是否会有任何空格取决于实际的预处理器。对于GNU cpp,有一个。)

与目前为止的其他答案一样,您可以使用#ifdef来测试标识符是否已经#define d。 你也可以这样写:

 #if defined(DEF_C) 

例如。 即使扩展为空,这些测试也是正的(即,标识符定义)。

这意味着定义了FAHAD ,您可以稍后检查它是否已定义:

 #ifdef FAHAD //do something #else //something else #endif 

要么:

 #ifndef FAHAD //if not defined //do something #endif 

实际的示例用法是检查您的平台是否有可用的函数或标题,通常构建系统将定义宏以指示在实际编译之前存在某些函数或标题,例如,这将检查signal.h是否可用:

 #ifdef HAVE_SIGNAL_H # include  #endif/*HAVE_SIGNAL_H*/ 

这将检查某些function是否可用

 #ifdef HAVE_SOME_FUNCTION //use this function #else //else use another one #endif 
 #define FAHAD 

这将像编译器标志一样,在其下可以完成一些代码。 这将指示编译器编译此编译器选项下的代码

 #ifdef FAHAD printf(); #else /* NA */ #endif