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