我在代码中使用了 JUCE 库和一些 Boost header 。 Juce 将“T”定义为宏(呻吟),Boost 经常在其模板定义中使用“T”。结果是,如果您以某种方式在 Boost header 之前包含 JUCE header ,则预处理器会扩展 Boost 代码中的 JUCE 宏,然后编译器将无可救药地丢失。
在大多数情况下,以正确的顺序保持我的包含内容并不难,但是当您有一个包含其他一些类的 JUCE 类并且在链上某个文件包含 Boost 时,它可能会变得很棘手,并且如果其中任何一个在需要 JUCE 之前的文件包括你有麻烦了。
我最初希望解决这个问题
#undef T
在 Boost 的任何包含之前。但问题是,如果我不重新定义它,那么其他代码会因为没有声明“T”而感到困惑。
然后我想也许我可以做一些循环#define 欺骗,如下所示:
// some includes up here
#define ___T___ T
#undef T
// include boost headers here
#define T ___T___
#undef ___T___
丑陋,但我认为它可能有用。
遗憾的是没有。我在使用“T”作为宏的地方遇到错误
'___T___' was not declared in this scope.
有没有办法让这两个库可靠地协同工作?
最佳答案
正如 greyfade 指出的那样,你的 ___T___
技巧不起作用,因为预处理器是一个非常简单的生物。另一种方法是使用 pragma 指令:
// juice includes here
#pragma push_macro("T")
#undef T
// include boost headers here
#pragma pop_macro("T")
这应该适用于 MSVC++,并且 GCC 添加了对 pop_macro
和 push_macro
的支持以与其兼容。从技术上讲,它是依赖于实现的,但我认为没有一种标准方法可以暂时抑制定义。
关于c++ - 我可以重新定义 C++ 宏然后重新定义它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737096/