2011-01-12 75 views
0

可能重复:
c++ preprocessor macro expansion to another preprocessor directive定义宏扩展到了文字#

我的问题很简单:我想在宏扩展到使用“#”,例如,定义一个马可“M(X)”:

#define M(X) #ifdef FOO \ 
       X=1 \ 
      #else \ 
       X=2 

我试图用“\”逃脱“#”,但“\”被解释为换行˚F或宏扩展,而不是作为转义字符。 那么如何在宏扩展中使用'#'?

谢谢大家!

+0

你应该接受你认为有帮助的答案。 (点击勾号并将其变成绿色。) – 2011-01-12 18:38:23

回答

6

对不起,但您不能让宏发射另一个宏,因为预处理器是单通道。也从C99标准:

(6.10.3.4第3段):

3所得的完全 宏替换预处理记号 序列不被处理,即使它酷似 一个 预处理指令,...

C++也有类似的东西。

+0

Didnt期望得到如此快速和准确的答复,敬礼! – lukmac 2011-01-12 15:46:13

6

你可以做相反的事情:

#ifdef FOO 
    #define M(X) X=1 
#else 
    #define M(X) X=2 
#endif 
+0

+1,看起来像一个合理的解决方案。 – 2011-01-12 15:40:19

1

由于@Evan指出,宏扩展是在单次完成,所以你的榜样将无法工作。但是,这里有一个替代方案可以实现你想要的,尽管还有更多的线路。

#ifdef FOO 
#define FOOVAL 1 
#else 
#define FOOVAL 2 
#endif 

#define M(X) X=FOOVAL