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

GCC中宏X引用后置定义的TEST仍能正常展开的原因咨询

问题:宏X引用后续定义的TEST,为何仍能正确展开?

相关代码

foo.h

//foo.h

#define X TEST-9

#define TEST 10

foo.c

//foo.c
#include<stdio.h>
#include"foo.h"

int main(void)
{
  int a = X;
  printf("%d\n", a);
}

编译与运行过程

  • 执行编译命令:
gcc -o foo foo.c -Wall -Wextra

编译无输出(说明编译成功)

  • 运行程序:
./foo

运行结果:1

问题解答

这事儿的关键在于C语言宏的展开机制——宏定义只是记录替换规则,不是当场就把内容计算好,具体的替换是在宏被实际使用的时候才触发的:

  • 当预处理器读到#define X TEST-9时,不会去管TEST此时有没有定义,只是把X对应的替换内容原封不动存成TEST-9。
  • 等到编译到int a = X;这一行,预处理器才会把X展开成TEST-9,这时候#define TEST 10已经被处理过了,所以紧接着又把TEST替换成10,最终得到10-9,运行时计算结果就是1。

内容的提问来源于stack exchange,提问作者Kid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:15:37