在带有空括号的define中会发生什么?例如:#定义FOO()? 简单地说,在我的C++知识(或缺少)中,Foo将被定义为括号中的什么。但是如果括号是空的,会发生什么呢?它等于0吗?这意味着#ifdef foo(0)将执行与#ifdef foo()相同的操作?如果在空括号中使用等效项有任何有用的效果?
在带有空括号的define中会发生什么?例如:#定义FOO()? 简单地说,在我的C++知识(或缺少)中,Foo将被定义为括号中的什么。但是如果括号是空的,会发生什么呢?它等于0吗?这意味着#ifdef foo(0)将执行与#ifdef foo()相同的操作?如果在空括号中使用等效项有任何有用的效果?,c++,syntax,branch,c-preprocessor,C++,Syntax,Branch,C Preprocessor,#define是一个绝对愚蠢的文本替换。因此: #define FOO () int main() { FOO; } 变成 int main() { (); } 您可以使用-E选项对g++(我也认为clang)进行测试,这意味着“只需进行预处理”,或者等效地,只需运行cpp工具,即c预处理器。 i、 e $echo-e“#define FOO()\nint main()\n{\n FOO;\n}”>def.cpp;g++-E def.cpp #1“定义cpp” # 1 ""
#define
是一个绝对愚蠢的文本替换。因此:
#define FOO ()
int main()
{
FOO;
}
变成
int main()
{
();
}
您可以使用-E
选项对g++
(我也认为clang
)进行测试,这意味着“只需进行预处理”,或者等效地,只需运行cpp
工具,即c预处理器。
i、 e
$echo-e“#define FOO()\nint main()\n{\n FOO;\n}”>def.cpp;g++-E def.cpp
#1“定义cpp”
# 1 ""
#1“定义cpp”
int main()
{
();
}
(这些是Linux/其他Unix命令行工具)。#define
是一个预处理器指令,只是一个愚蠢的文本替换规则,它发生在实际编译代码之前。应用宏定义时还没有代码模型
#define FOO ()
将每次出现的FOO
替换为()
将每次出现的FOO
替换为(0)
将每次出现的FOO
替换为0
,这与(0)
不同(在某些情况下,这会产生不同)
但是,
#define FOO()
不使用任何内容替换
FOO()
,不触摸FOO
宏扩展将只扩展到宏扩展到的任何对象:
#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
不会干净地编译(“在gcc中#ifdef结尾的额外标记”),其他编译器可能会给出其他错误
#define CRAPFOO ()
#ifdef CRAPFOO
do something
#else
not something
#endif
将给
做某事作为结果。注意#define FOO()
和#define FOO()
之间的区别。我想我从来没有见过#define FOO()
,但是#define FOO()
经常出现。彼得森你是年度人物。谢谢你的例子。你也预料到了一个问题,让我来到这里,问这个问题,你也回答了发生了什么。所以是的,gcc在这个定义中抛出了错误。我也不明白它将进入哪个分支。
#define FOO()
#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
#ifdef CRAPFOO ()
#define CRAPFOO ()
#ifdef CRAPFOO
do something
#else
not something
#endif