gpt4 book ai didi

c - 像宏这样的函数需要强制括号吗?引用 GCC cpp 手册后我很困惑

转载 作者:行者123 更新时间:2023-12-01 02:31:46 26 4
gpt4 key购买 nike

这是让我感到困惑的地方:

To define a function-like macro, you use the same '#define' directive, but you put a pair of parentheses immediately after the macro name.

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

A function-like macro is only expanded if its name appears with a pair of parentheses after it. If you write just the name, it is left alone.

看完后我立即不同意。并且 gcc -E 在以下代码中验证了这一点

#define FUNC display()

void display()
{
printf("Display\n");
}

int main()
{
FUNC;
return 0;
}

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

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

那么我在这里缺少什么?预处理器用于标记源,宏扩展是一个标记,上面的代码就是这样处理的,预处理器不应该检查任何东西或验证任何东西,它只是转储标记。在那种情况下,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() as macro and C standard library function definition .它包括标准的解释,说明为什么不扩展没有后跟左括号的类似函数的宏的简单名称很重要,这就是 GCC 手册中的引述告诉您的内容。

定义类函数宏时,左括号必须“接触”宏名称:

#define function_like(a) …
#define 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 - 像宏这样的函数需要强制括号吗?引用 GCC cpp 手册后我很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40045529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com