将宏参数与文本连接起来

Concatenate a macro parameter with text

我目前正致力于将一些代码从 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 中遇到此问题的任何建议以及我将如何解决此问题?

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;