用空括号定义会发生什么?例:#define FOO()

What happens in a define with empty parentheses? ex: #define FOO ()?

本文关键字:#define FOO 什么 定义      更新时间:2023-10-16

简单地说,在我的c++知识(或缺乏)中,FOO在定义时将被括号中的内容所取代。但是如果括号是空的呢?它是否等于0?这意味着#ifdef foo (0)会和#ifdef foo ( )做同样的事情?如果相等,空括号有什么有用的效果吗?

一个宏展开后将会被展开为它所要展开的内容:

#include <stdio.h>
#define L (
#define R )
#define l {
#define r }
#define LR ()
int main LR
l 
   printf L "Hello, Worldn" R;
   return 0;
r

可以很好地编译(如果你把L/R/L/R宏隐藏在头文件中,没有人会明白你做了什么。)请注意,至少在某些地方需要空格,以确保宏实际展开。

这句话

 #ifdef CRAPFOO ()

不会编译干净(在gcc中"在#ifdef的末尾有额外的标记"),其他编译器可能会给出其他错误。

 #define CRAPFOO ()
 #ifdef CRAPFOO
    do something
 #else
    not something
 #endif 

将给出do something作为结果。

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

#define FOO ()
int main()
{
    FOO;
}

int main()
{
    ();
}

你可以用-E选项来测试g++(我认为clang也是),这意味着"只是做预处理",或者等价地,只是运行cpp工具,这是c预处理器。例如

$ 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命令行工具)

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

#define FOO ()

()替换出现的FOO

#define FOO (0)

将出现的FOO替换为(0)

#define FOO 0

0替换FOO的每一次出现,这是而不是(0)相同(在某些情况下这会产生差异)。

然而,

#define FOO()

FOO()替换为none,不触及FOO