为何空预处理宏BAR调用未报错且返回最后参数?C语言规则解析
空宏
BAR(1,2,3)的预处理行为解释 先看你的代码片段:
#include <stdio.h> #define BAR int main(int argc, char *argv[]) { int foo = 1; foo = BAR(1, 2, 3); printf("%d\n", foo); return 0; }
你以为预处理后会变成foo = ;是错的,实际处理后的代码是foo = (1, 2, 3);,这也是代码能正常编译且foo值为3的原因,具体逻辑如下:
- C预处理器处理无参数宏
#define BAR时,只会把标识符BAR替换为空字符串,后面跟着的(1,2,3)会原封不动保留,不会被当作宏参数处理——只有定义带参数的宏(比如#define BAR(...))时,预处理器才会解析括号里的内容作为参数。 (1,2,3)是C标准中的逗号表达式,它的求值规则是从左到右依次计算每个子表达式,整个表达式的最终结果是最后一个子表达式的值。这里就是先算1、再算2、最后取3的值,所以foo被赋值为3。
这是C语言标准明确定义的行为,并非编译器的特殊处理。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

