Aft*_*hew 40 c++ macros boost c-preprocessor
我在我的代码中使用了JUCE库和一些Boost头文件.Juce将"T"定义为宏(呻吟),Boost经常在其模板定义中使用"T".结果是,如果你以某种方式在Boost头之前包含JUCE头,那么预处理器会扩展Boost代码中的JUCE宏,然后编译器就会无可救药地丢失.
在大多数情况下保持我的包含顺序并不难,但是当你有一个包含一些其他类的JUCE类时,它会变得棘手,在链上的某个地方,一个文件包含Boost,如果有任何文件在它之前需要JUCE包括你遇到麻烦.
我最初的希望是解决这个问题
#undef T
Run Code Online (Sandbox Code Playgroud)
之前任何包括Boost.但问题是,如果我不重新定义它,那么其他代码会混淆"T"未被声明.
然后我想也许我可以这样做一些循环的#define技巧:
// some includes up here
#define ___T___ T
#undef T
// include boost headers here
#define T ___T___
#undef ___T___
Run Code Online (Sandbox Code Playgroud)
丑陋,但我认为它可能有用.
可悲的是没有.我在使用"T"作为宏的地方出错
'___T___' was not declared in this scope.
Run Code Online (Sandbox Code Playgroud)
有没有办法让这两个库可靠地一起工作?
Pet*_*ter 64
正如greyfade指出的,你的___T___技巧不起作用,因为预处理器是一个非常简单的生物.另一种方法是使用pragma指令:
// juice includes here
#pragma push_macro("T")
#undef T
// include boost headers here
#pragma pop_macro("T")
Run Code Online (Sandbox Code Playgroud)
这应该在MSVC++中有效,GCC增加了对它的支持pop_macro和push_macro兼容性.从技术上讲,它依赖于实现,但我不认为有一种暂时抑制定义的标准方法.
Mar*_*ett 11
你可以将违规库包装在另一个include中并将#define T陷入其中吗?
例如:
JUICE_wrapper.h:
#include "juice.h"
#undef T
main.cpp:
#include "JUICE_wrapper.h"
#include "boost.h"
rest of code....
Run Code Online (Sandbox Code Playgroud)
然后我想也许我可以做一些循环#define 欺骗,如下所示:
C 预处理器不是这样工作的。预处理器符号的定义方式与在定义函数时赋予符号含义不同。
将预处理器视为文本替换引擎可能会有所帮助。定义符号后,它将被视为直接文本替换,直到文件末尾或直到未定义为止。它的值不存储在任何地方,因此无法复制。T因此,在编辑后恢复定义的唯一方法是在代码中的#undef新代码中完全重现其值。#define
您能做的最好的事情就是不使用 Boost 或请求 JUCE 的开发人员不要将其用作T宏。(或者,最坏的情况是,通过更改宏的名称自行修复。)