c++ - 将宏参数与文本连接起来

标签 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 中遇到这个问题有什么建议吗?我将如何解决这个问题?

最佳答案

要么从 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/

相关文章:

c++ - C++ 中的 typedef 变量

c - 跟踪静态内联函数

c - 如何使用 ## 运算符连接和计算宏

c++ - 使用某个宏时如何禁止调用特定函数

C 宏扩展命令

c++ - 使用 qt 中的事件将项目属性传递给主窗口

c++ - 尽管使用了 C++14 功能,为什么使用 C++11 编译成功?

java bean类创建的scala宏未知类型错误

c++ - 将 QProcess 用于 CLI

c++ - (C++) 使用指向整数的引用指针初始化字符串变量并打印一些东西?