在带有空括号的定义中会发生什么?例如:#define FOO()?

时间:2013-04-30 09:44:31

标签: c++ syntax branch c-preprocessor

简单地说,在我的C ++知识(或缺乏)中,当定义它时,FOO将被替换为括号中的内容。但如果括号是空的,会发生什么?它等于0吗?这意味着#ifdef foo (0)会与#ifdef foo ( )做同样的事情吗?如果等效是与空括号一起使用的任何有用效果吗?

3 个答案:

答案 0 :(得分:2)

#define是一个绝对愚蠢的文本替代品。所以:

#define FOO ()

int main()
{
    FOO;
}

变为

int main()
{
    ();
}

您可以使用-E选项g++(我认为clang也是如此)进行测试,这意味着“只需进行预处理”,或者等效地运行{{1工具,这是c预处理器。 即。

cpp

(这些是Linux /其他Unix命令行工具)。

答案 1 :(得分:2)

宏扩展只会扩展到宏扩展到的任何内容:

#include <stdio.h>

#define L (
#define R )
#define l {
#define r }
#define LR ()

int main LR
l 
   printf L "Hello, World\n" R;
   return 0;
r

编译得非常好(如果你把L / R / l / r宏隐藏在头文件中,没人会理解你做了什么。请注意,至少在某些地方需要空格以确保宏实际上扩展。

本声明

 #ifdef CRAPFOO ()

不会干净地编译(gcc中“#ifdef末尾的额外令牌”,其他编译器可能会给出其他错误。

 #define CRAPFOO ()
 #ifdef CRAPFOO
    do something
 #else
    not something
 #endif 

将给出do something作为结果。

答案 2 :(得分:0)

#define是一个预处理程序指令,它只是一个愚蠢的文本替换规则,它在实际编译代码之前发生。在应用宏定义时,还没有代码模型。

#define FOO ()

FOO的每次出现替换为()

#define FOO (0)

FOO的每次出现替换为(0)

#define FOO 0

FOO的每一次出现替换为0(0)相同(有些情况会有所不同)。< / p>

然而,

#define FOO()

不用任何内容替换FOO(),不触及FOO