可能重复:
c++ preprocessor macro expansion to another preprocessor directive
我的问题很简单:我想在宏扩展中使用“#”,例如,定义一个marco'M(X)':
#define M(X) #ifdef FOO \
X=1 \
#else \
X=2
我尝试使用'\'来转义'#',但'\'被解释为宏扩展的换行符,而不是转义字符。 那么如何在宏扩展中使用'#'?
谢谢大家!
答案 0 :(得分:6)
很抱歉,但由于预处理器是单通道,因此您无法让宏发出另一个宏。同样来自c99标准:
(6.10.3.4第3段):
3结果完全 宏替换的预处理令牌 序列不作为a处理 预处理指令,即使它 类似于......,
c ++也有类似的东西。
答案 1 :(得分:6)
你可以这样做:
#ifdef FOO
#define M(X) X=1
#else
#define M(X) X=2
#endif
答案 2 :(得分:1)
正如@Evan指出的那样,宏扩展只需一次完成,因此您的示例将无效。然而,这里有一个替代方案可以做你想要的,尽管还有几行。
#ifdef FOO
#define FOOVAL 1
#else
#define FOOVAL 2
#endif
#define M(X) X=FOOVAL