跟随我的(duplicate)question(以及StoryTeller的建议)
为什么预处理程序宏会忽略括号中的函数名称?
#include <stdio.h>
#include <stdlib.h>
#define abs(x) ((x))
int main(void)
{
printf("%d\n", abs(-1)); // output: -1
printf("%d\n", (abs)(-1)); // output: 1
return 0;
}
这是在标准中定义的吗?
最佳答案
预处理程序的宏替换指定如下:
6.10.3 Macro replacement / p10-重点:
它在那里以粗体显示。为了进行替换,宏名称之后的下一个预处理 token 必须是(
。当它是)
时,例如当宏放在括号中时,将不会发生替换。
这样就只剩下括号中的函数名称,该表达式与函数的指示符相同。