-1

简而言之,在我的 C++ 知识(或缺乏)中,FOO 将被定义为括号中的内容。但是如果括号为空会发生什么?是否等于0?这意味着 a #ifdef foo (0)will 做与#ifdef foo ( )? 如果等效,是否可以与空括号一起使用任何有用的效果?

4

3 回答 3

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

于 2013-04-30T09:53:39.127 回答
2

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

#define FOO ()

int main()
{
    FOO;
}

变成

int main()
{
    ();
}

您可以使用以下-E选项来测试它g++(我clang也这么认为),这意味着“只进行预处理”,或者等效地,只运行该cpp工具,即 c 预处理器。IE

$ echo -e "#define FOO ()\nint main()\n{\n    FOO;\n}" > def.cpp ; g++ -E def.cpp 
# 1 "def.cpp"
# 1 "<command-line>"
# 1 "def.cpp"

int main()
{
    ();
}

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

于 2013-04-30T09:49:32.613 回答
0

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

#define FOO ()

FOO用替换每一次出现()

#define FOO (0)

FOO用替换每一次出现(0)

#define FOO 0

替换每次出现的FOOwith 0,这(0)在某些情况下会有所不同)不同。

然而,

#define FOO()

无所取代FOO(),不触碰FOO

于 2013-04-30T09:51:10.977 回答