c++ - 我可以重新定义 C++ 宏然后重新定义它吗?

标签 c++ boost macros c-preprocessor

我在代码中使用了 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_macropush_macro 的支持以与其兼容。从技术上讲,它是依赖于实现的,但我认为没有一种标准方法可以暂时抑制定义。

关于c++ - 我可以重新定义 C++ 宏然后重新定义它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737096/

相关文章:

c++ - boost 日志记录类属性

c++ - Dynamic#include 基于宏定义

C++如何使用fstream读取带空格的制表符分隔文件

c++ - 分解在 Visual C++ 中不起作用的函数

c++ - 编译期间 vector 下标超出范围

c++ - 在 C/C++ 中监视变量访问

c++ - 使用 Boost 库的错误

linux - 尽管使用了 BOOST_ROOT,但无法找到我的本地 Boost 发行版而不是已安装的发行版

使用类似位图的宏在编译时创建函数

macros - 如何匹配 Rust 宏中表达式的类型?