简而言之,在我的 C++ 知识(或缺乏)中,FOO 将被定义为括号中的内容。但是如果括号为空会发生什么?是否等于0?这意味着 a #ifdef foo (0)
will 做与#ifdef foo ( )
? 如果等效,是否可以与空括号一起使用任何有用的效果?
问问题
831 次
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
替换每次出现的FOO
with 0
,这与((0)
在某些情况下会有所不同)不同。
然而,
#define FOO()
无所取代FOO()
,不触碰FOO
于 2013-04-30T09:51:10.977 回答