2

我有一个宏 TYPELIST,它接受可变参数。我想要类似的东西

typedef TYPELIST(A
                ,B
                ,C
                ,D
#ifdef BLA_
                ,E
#endif
                ,F)

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

4

2 回答 2

0

在宏中使用#ifdef 是不合法的。我有点惊讶 gcc 允许这样做。恐怕您必须将#ifdef 放在整个定义中,即

#ifdef BLA_
    typedef TYPELIST(a,b,c,d,e,f)
#else
    typedef TYPELIST(a,b,c,d,f)
#endif
于 2013-10-01T08:40:01.510 回答
0

根据标准(第 16.3.4/3 节),“生成的完全用宏替换的预处理令牌序列不会作为预处理指令处理,即使它类似于一个,[...]”。如果 g++ 在#ifdef/#endif此处处理,这是编译器中的错误(至少如果您要求符合标准,例如 with -std=...)。

于 2013-10-01T08:40:23.073 回答