gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:44:53 25 4
gpt4 key购买 nike

我在代码中使用了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com