为什么预处理器宏忽略括号中的语句

Kam*_*aze 2 c c-preprocessor

关注我的(重复)问题(并由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;
}
Run Code Online (Sandbox Code Playgroud)

这是在标准中定义的吗?

Sto*_*ica 9

预处理器的宏替换指定如下:

6.10.3宏替换/ p10 - 强调我的:

表单的预处理指令

# define identifier lparen identifier-list<opt> ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line
Run Code Online (Sandbox Code Playgroud)

定义了一个带有参数的类函数宏,它的用法在语法上与函数调用类似.参数由可选的标识符列表指定,其范围从它们在标识符列表中的声明扩展到终止#define预处理指令的换行符.类似函数的宏名称的每个后续实例后跟一个(作为下一个预处理标记引入了预处理标记序列,该标记由定义中的替换列表替换(宏的调用).预处理标记的替换序列是由匹配的预处理令牌终止,跳过中间匹配的左右括号预处理令牌对.在构成类函数宏调用的预处理令牌序列中,换行被认为是正常的空白字符.

它用粗体说它就在那里.要进行替换,宏名称后面的下一个预处理标记必须是a (.当它是a时),例如当宏在括号中时,不会发生替换.

因此,只留下括号中的函数名称,这个表达式与函数的指示符相同.