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