跟随我的(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 必须是(。当它是)时,例如当宏放在括号中时,将不会发生替换。

这样就只剩下括号中的函数名称,该表达式与函数的指示符相同。

07-26 05:52