像宏这样的函数是否需要强制括号? 在参考GCC cpp手册后我很困惑

这让我感到困惑:

要定义类似函数的宏,可以使用相同的’#define’指令,但是在宏名称后面紧跟一对括号。

我相信这是为了让代码脱颖而出,而不是该程序的作者。 像宏名称的其他CAPS规则一样。 但以下是我感到困惑的地方:

类似函数的宏只有在其名称后面带有一对括号时才会展开。 如果你只写这个名字,那就不管它了。

我读完之后立刻就不同意了。 并且gcc -Evalidation了以下代码

#define FUNC display() void display() { printf("Display\n"); } int main() { FUNC; return 0; } 

预处理的输出按预期显示main()函数的内容:

 int main() { display(); return 0; } 

那我在这里错过了什么? 预处理器用于标记源,宏扩展是一个令牌,上面的代码以这种方式处理,预处理器不应该检查任何东西或validation任何东西,它只是转储令牌。 在那种情况下,gcc手册试图传达什么。

我正在学习C编程,所以我可能会经常发生误解,我搜索了一个正确的解释,最后在这里求助。 请帮我解决一下这个。

当你定义:

 #define FUNC display() 

FUNC不是类似函数的宏; 它是一个类似于对象的宏,可以扩展为函数调用。

类似函数的宏看起来像:

 #define FUNC() display() 

现在你必须编写FUNC()来调用它。 或者,更常见的是,它会有参数:

 #define MIN(x, y) ((x) > (y) ? (x) : (y)) 

并且可以使用以下方法调用:

 int min = MIN(sin(p), cos(q)); 

注意参数扩展的次数。

另请参见getc()作为宏和C标准库函数定义 。 它包括标准的解释,为什么重要的是扩展没有后面的左括号的函数式宏的简单名称,这是GCC手册的引用告诉你的。

当定义类似函数的宏时,左括号必须“触摸”宏名称:

 #define function_like(a) … #define object_like (…) 

因为在object_like之后有一个空格,所以object_like括号是替换文本的一部分,而不是参数列表的开头。 当调用类似函数的宏时,宏名称和参数列表之间可能有空格:

 function_like (x) // Valid invocation of function_like macro. 

但是,如果你写道:

 int (function_like)(double a) { return asin(a) + 2 * atanh(a); } 

这不是函数式宏的调用,因为function_like之后的标记不是一个开括号。

有两种宏。 它们的大部分区别在于它们在使用时的外观。
类似对象的宏在使用时类似于数据对象,类似函数的宏类似于函数调用。

您可以将任何有效标识符定义为宏,即使它是C关键字。 预处理器对关键字一无所知。 如果您希望从不能理解它的旧编译器中隐藏诸如const之类的关键字,这将非常有用。 但是,预编译器操作符永远不能被定义为宏,并且在编译C ++时C ++的命名操作符不能是宏。