2015-04-22 139 views
0

我目前正致力于将一些代码从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

DECLARE_LEGACY_TYPES宏的每一行中删除前两个##,或者创建一个没有它们的新版本。它们是完全不必要的,如果不是实际需要的话,GCC给出的错误是由标准C++允许的。使用##预处理运算符的结果必须是有效的预处理令牌,并且::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; 
+0

感谢职位。我现在正在测试这个 – MistyD

+0

如果我删除前两个'##'不会参数替代停止?例如你发布的例子。对于第一种情况,使用'CONFORMING_DECLARE_LEGACY_TYPES(foo)'将产生'LG_Wrapper :: ClassType ClassType;而第二种情况产生'LG_Wrapper :: foo ClassType;'?而我想要第二种情况 – MistyD

+0

不,为什么呢?而你不想要第二种情况,你需要'LG_Wrapper :: foo foo'。预处理器标记'ClassType'的所有实例将被替换,就像在任何宏替换中一样。 –