宏调用中的#ifdef与gcc一起使用但不与msvc一起使用

时间:2013-10-01 08:27:54

标签: c++ visual-c++ gcc macros variadic-macros

我有一个宏TYPELIST,它接受可变参数。我想要像

这样的东西
typedef TYPELIST(A
                ,B
                ,C
                ,D
#ifdef BLA_
                ,E
#endif
                ,F)

这与gcc完美配合。但是,当我尝试使用MSVC编译它时,它将ifdef和endif解析为宏参数。我知道一种方法是将宏调用放在ifdef中。但是,如果我有一个庞大的列表,并且如果我想根据定义的不同宏包含不同的类,那将变得乏味。是否有一个特殊的原因可以解释为什么它适用于gcc而不适用于MSVC?

2 个答案:

答案 0 :(得分:0)

在宏中使用#ifdef是不合法的。我很惊讶gcc允许这样做。我担心你必须把#ifdef放在整个定义的周围,即

#ifdef BLA_
    typedef TYPELIST(a,b,c,d,e,f)
#else
    typedef TYPELIST(a,b,c,d,f)
#endif

答案 1 :(得分:0)

根据标准(§16.3.4/ 3),“结果完全 宏替换的预处理标记序列未被处理为 一个预处理指令,即使它类似于一个,[。]“。如果 g ++在这里处理#ifdef/#endif,这是一个错误 编译器(至少如果您要求标准符合性, 例如与-std=...)。