【发布时间】:2010-12-20 02:39:48
【问题描述】:
我在我的代码中同时使用了 JUCE 库和一些 Boost 标头。 Juce 将“T”定义为宏(groan),而 Boost 在其模板定义中经常使用“T”。结果是,如果您以某种方式在 Boost 标头之前包含 JUCE 标头,则预处理器会在 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.
有没有办法让这两个库可靠地协同工作?
【问题讨论】:
-
你为什么将 T 定义为 T,然后立即取消定义 T(反之亦然)?
-
我想我可以通过查找原始定义并重新定义来解决这个问题,但我宁愿有更通用和更可靠的东西。
-
Jim 我不确定格式是否让您的问题更难理解,但我认为我的问题很干净?你认为你可以改写你的问题吗?
-
我认为这是不可能的。也许制作一个包装头来取消定义 T 并用不同的名称定义宏。
标签: c++ boost macros c-preprocessor