像宏这样的函数是否需要强制括号? 在参考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 ++的命名操作符不能是宏。