2012-06-11 128 views
5

考虑变量宏宏扩展以下Ç(忽略双副作用的问题):与参数与具有相同名称

#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说:

类似函数的宏只有在它的名字出现时带有一对括号后才被展开。如果你只是写出这个名字,那么它就被单独留下了。

这是标准化还是只是按照惯例做的事情?

回答

5

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

您的宏max是一个函数宏(即,当你定义它,它的名字立即由左括号其次,它需要参数)。

稍后在代码中使用max只是在使用max后跟左括号时调用该宏。因此,这些不会调用max宏:

int max; 
max = 42; 

但这些都会调用最大宏:

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

(请注意,是形成不良的最后一行,因为参数的个数不匹配的参数的数量。这仍然是一个宏调用,不过,会导致编译错误。)

这种行为是由C的langauge标准规定。 C99§6.10.3/ 10指出,后一函数宏已定义,

的函数宏名称,后跟一个(作为下一预处理标记的每个后续的实例介绍了预处理标记的序列它被定义中的替换列表(宏的调用)取代。

+0

我很困惑。它看起来像海湾合作委员会荣幸的最大宏,并没有改为调用真正的最大功能。 – octopusgrabbus

+0

@octopusgrabbus:什么'max'功能? –

+0

发现了GCC手册中的相关部分,但我仍然不知道这是标准化还是非正式的约定 – mensi

相关问题