预处理标记能否被屏蔽展开?如何定义宏保留宏名而非展开值?
预处理标记能否被屏蔽展开?
假设我们定义了如下宏:
#define FOO 42
想要定义一个宏SHIELD(x),使得SHIELD(FOO)展开为FOO而非42,结论如下:
在标准C预处理器的规则下,无法直接让SHIELD(FOO)展开为标识符FOO,但可以通过字符串化操作得到对应的字符串字面量"FOO"。
具体解释:
C预处理器的宏替换遵循固定顺序:
- 首先会对宏调用的参数进行展开(除非参数在替换文本中会被
#或##操作符处理); - 然后用展开后的参数替换宏替换文本中的参数名;
- 最后对替换结果再次进行宏展开。
- 若定义普通身份宏:
#define SHIELD(x) x
SHIELD(FOO)会先展开参数FOO为42,最终结果是42,不符合需求。
- 若利用字符串化操作符
#:
#define SHIELD(x) #x
此时SHIELD(FOO)会直接将参数FOO字符串化,得到"FOO"——这是字符串字面量,而非标识符FOO。
标准C预处理器没有提供将字符串字面量转换为标识符的能力,因此无法实现让SHIELD(FOO)展开为标识符FOO的需求。
内容的提问来源于stack exchange,提问作者n.m.is-an-unemployed-ai-agent
相关产品推荐
相关产品推荐

