men*_*nsi 5 c macros gcc c-preprocessor
考虑以下C程序(忽略双重副作用问题):
#define max(a, b) (a>b?a:b)
int main(void){
int max = max(5,6);
return max;
}
Run Code Online (Sandbox Code Playgroud)
GCC预处理器将其转换为:
int main(void){
int max = (5>6?5:6);
return max;
}
Run Code Online (Sandbox Code Playgroud)
这是非常好的,因为你不必担心max和之间的无意碰撞max().在GCC手册说:
类似函数的宏只有在其名称后面带有一对括号时才会展开.如果你只是写下这个名字,那就不管它了
这是标准化还是按照惯例完成的事情?
是的,这里的行为是明确定义的.
您的宏max是一个类似函数的宏(即,当您定义它时,其名称后面紧跟左括号并且它接受参数).
max稍后在代码中使用的只是对该宏的调用,如果使用max后跟左括号.所以,这些不会调用max宏:
int max;
max = 42;
Run Code Online (Sandbox Code Playgroud)
但这些都会调用max宏:
max(1, 2)
max (1, 2)
max
(
1, 2
)
max()
Run Code Online (Sandbox Code Playgroud)
(注意,最后一行是格式错误的,因为参数的数量与参数的数量不匹配.但这仍然是一个宏调用,并且会导致编译错误.)
这种行为是由C语言标准强制执行的.C99§6.10.3/ 10指出在定义了类似函数的宏之后,
类函数宏名称后跟a
(作为下一个预处理标记的每个后续实例引入了预处理标记序列,该标记由定义中的替换列表(宏的调用)替换.
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |