gpt4 book ai didi

c - 具有参数的宏与具有相同名称的变量的宏扩展

转载 作者:太空狗 更新时间:2023-10-29 15:02:45 24 4
gpt4 key购买 nike

考虑以下 C 程序(忽略双重副作用问题):

#define max(a, b) (a>b?a:b)

int main(void){
int max = max(5,6);
return max;
}

GCC 预处理器将其转换为:

int main(void){
int max = (5>6?5:6);
return max;
}

这非常好,因为您不必担心 maxmax() 之间的意外冲突。 GCC manual说:

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

这是标准化的还是只是约定俗成的?

最佳答案

是的,这里的行为是明确定义的。

您的宏 max 是一个类似函数的宏(即,当您定义它时,它的名称后面紧跟着一个左括号,并且它带有参数)。

如果 max 的使用后跟一个左括号,则稍后在您的代码中使用 max 只是对该宏的调用。因此,这些不会调用 max 宏:

int max;
max = 42;

但是这些都会调用 max 宏:

max(1, 2)
max (1, 2)
max
(
1, 2
)
max()

(请注意,最后一行格式错误,因为参数的数量与参数的数量不匹配。但这仍然是一个宏调用,并且会导致编译错误。)

此行为是 C 语言标准强制要求的。 C99 §6.10.3/10 声明在定义了一个类似函数的宏之后,

Each subsequent instance of the function-like macro name followed by a ( as the next preprocessing token introduces the sequence of preprocessing tokens that is replaced by the replacement list in the definition (an invocation of the macro).

关于c - 具有参数的宏与具有相同名称的变量的宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10984270/

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