代码之家  ›  专栏  ›  技术社区  ›  Aftermathew

我能重新定义C++宏然后定义它吗?

  •  37
  • Aftermathew  · 技术社区  · 15 年前

    在大多数情况下,保持我的include的正确顺序并不困难,但是当你有一个包含其他类的JUCE类,并且在链的某个位置,一个文件包含Boost,如果在它需要JUCE include之前有任何文件,你就麻烦了。

    我最初希望解决这个问题是

    #undef T
    

    然后我想也许我可以做一些循环#定义这样的骗术:

    // some includes up here
    #define ___T___ T
    #undef T
    // include boost headers here
    #define T ___T___
    #undef ___T___
    

    '___T___' was not declared in this scope.
    

    有没有办法让这两个库可靠地协同工作?

    3 回复  |  直到 8 年前
        1
  •  67
  •   Ajay    7 年前

    正如greyfade指出的,你的 ___T___ 这个把戏不起作用,因为预处理器是一个非常简单的生物。另一种方法是使用pragma指令:

     // juice includes here
     #pragma push_macro("T")
     #undef T
     // include boost headers here
     #pragma pop_macro("T")
    

    pop_macro push_macro

        2
  •  11
  •   Martin Beckett    15 年前

    你能将有问题的库包装在另一个include中,并将#define T困在其中吗?

    如:

    JUICE_wrapper.h:     
    #include "juice.h"
    #undef T
    
    main.cpp:    
    #include "JUICE_wrapper.h"    
    #include "boost.h"
    
     rest of code....
    
        3
  •  4
  •   greyfade    15 年前

    C预处理器不是这样工作的。预处理器符号的定义与符号的含义不同, ,则定义一个函数。

    将预处理器视为文本替换引擎可能会有所帮助。定义符号后,在文件结束或未定义之前,它将被视为直接向上的文本替换。它的值不存储在任何地方,因此无法复制。因此,只有这样,才能恢复的定义 T #undef 它是以一种新的方式完全复制它的价值 #define

    你能做的最好的事情就是不要使用Boost或者请求JUCE的开发者不要使用Boost T 作为一个宏(或者,在最坏的情况下,通过更改宏的名称来自行修复。)