define函数 - c++宏函数




我可以重新定义C++宏然后再定义它吗? (2)

我在我的代码中使用了JUCE库和一些Boost头文件。 Juce将“T”定义为宏(呻吟),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.

有没有办法让这两个库可靠地一起工作?


然后我想也许我可以像这样做一些循环的#define技巧:

C预处理器不能以这种方式工作。 预处理器符号的定义与定义符号的意义相同, 例如 ,您定义一个函数。

将预处理器视为文本替换引擎可能会有所帮助。 定义符号时,它被视为直接文本替换,直到文件结尾或未定义。 它的值不会存储在任何地方,因此无法复制。 因此,在#undef ed之后恢复T定义的唯一方法是在代码中的新#define完全重现其值。

您可以做的最好的事情就是不要使用Boost或请求JUCE的开发人员不要将T用作宏。 (或者,最坏的情况,通过更改宏的名称来自行修复。)


你可以将违规库包装在另一个包含中并将#define T陷入其中吗?

例如:

JUICE_wrapper.h:     
#include "juice.h"
#undef T

main.cpp:    
#include "JUICE_wrapper.h"    
#include "boost.h"

 rest of code....




c-preprocessor