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

预处理标记能否被屏蔽展开?如何定义宏保留宏名而非展开值?

预处理标记能否被屏蔽展开?

假设我们定义了如下宏:

#define FOO 42

想要定义一个宏SHIELD(x),使得SHIELD(FOO)展开为FOO而非42,结论如下:

在标准C预处理器的规则下,无法直接让SHIELD(FOO)展开为标识符FOO,但可以通过字符串化操作得到对应的字符串字面量"FOO"。

具体解释:

C预处理器的宏替换遵循固定顺序:

  • 首先会对宏调用的参数进行展开(除非参数在替换文本中会被#或##操作符处理);
  • 然后用展开后的参数替换宏替换文本中的参数名;
  • 最后对替换结果再次进行宏展开。
  1. 若定义普通身份宏:
#define SHIELD(x) x

SHIELD(FOO)会先展开参数FOO为42,最终结果是42,不符合需求。

  1. 若利用字符串化操作符#:
#define SHIELD(x) #x

此时SHIELD(FOO)会直接将参数FOO字符串化,得到"FOO"——这是字符串字面量,而非标识符FOO。

标准C预处理器没有提供将字符串字面量转换为标识符的能力,因此无法实现让SHIELD(FOO)展开为标识符FOO的需求。

内容的提问来源于stack exchange,提问作者n.m.is-an-unemployed-ai-agent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:50:26