在带有空括号的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