考虑以下 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说:



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

最佳答案

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

您的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指出,在定义了类似函数的宏之后,

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

10-11 19:41