You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何空预处理宏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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:12:05