我目前正致力于将一些代码从 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;
关于c++ - 将宏参数与文本连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29810019/