将宏参数与文本连接

时间:2015-04-22 22:23:29

标签: c++ macros

我目前正致力于将一些代码从Visual Studio移植到Mingw GCC。该代码在Visual Studio中构建并运行良好,但在Mingw GCC上存在一些问题。我遇到的一个问题是宏扩展。我在这里简化了这个例子。

#define DECLARE_LEGACY_TYPES(ClassType) \
        typedef LG_Wrapper::##ClassType##<LG_Wrapper::TA>               ClassType; \
        typedef LG_Wrapper::##ClassType##<LG_Wrapper::TB>           ClassType##TPR; \
        typedef LG_Wrapper::##ClassType##<LG_Wrapper::TC>   ClassType##DBN; \

现在当我尝试构建这个时,我得到了错误

 error: pasting "::" and "GraphicsDevice" does not give a valid preprocessing token
   typedef LG_Wrapper::##ClassType##<LG_Wrapper::TA>    ClassType; \
                     ^
 note: in expansion of macro 'DECLARE_LEGACY_TYPES'
 DECLARE_LEGACY_TYPES(GraphicsDevice);
 ^
 error: pasting "GraphicsDevice" and "<" does not give a valid preprocessing token
 DECLARE_LEGACY_TYPES(GraphicsDevice);

有关为什么我在mingw GCC而不是在Visual Studio中遇到此问题的任何建议以及我将如何解决此问题?

1 个答案:

答案 0 :(得分:1)

##宏的每一行中删除前两个DECLARE_LEGACY_TYPES或创建没有它们的新版本。它们完全没有必要,如果不是实际需要,标准C ++允许GCC给出的错误。使用##预处理运算符的结果必须是有效的预处理标记,而::GraphicsDevice不是有效的预处理标记。

你想要这样的东西:

#define CONFORMING_DECLARE_LEGACY_TYPES(ClassType)                    \
        typedef LG_Wrapper::ClassType<LG_Wrapper::TA> ClassType;      \
        typedef LG_Wrapper::ClassType<LG_Wrapper::TB> ClassType##TPR; \
        typedef LG_Wrapper::ClassType<LG_Wrapper::TC> ClassType##DBN;