全局重新定义多个冲突的预处理器定义

时间:2017-11-09 10:33:46

标签: c++ c-preprocessor

我有一个大型项目,其中包含一些冲突的预处理器函数定义,例如:

1.H:

#define CONFLICTINGMACRO(a, b) {doSomething(a, b)} 

2.H:

#define CONFLICTINGMACRO(a, b, c) {doSomethingElse(a, b, c)} 

某些文件会导入两个标题,但会找到错误的定义(首先加载的标题)。

我(重新)在名为redefinitions.h的文件中定义项目的其他符号(例如,Windows上的Windows功能和类型)

此文件通过编译器标志全局添加到项目的每个源文件中:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include redefinitions.h")

为了快速轻松地调试其他功能(我现在不需要冲突的宏),我尝试将以下行添加到redefinitions.h:

#ifdef CONFLICTINGMACRO
    #undef CONFLICTINGMACRO
#endif
#define CONFLICTINGMACRO(...) {}

不幸的是,这似乎没有什么区别。我最好的猜测是,这与加载* .h文件的顺序有关。

您对如何在整个项目中全局覆盖项目的不同头文件中定义的宏有任何想法吗?

1 个答案:

答案 0 :(得分:2)

没有简单的方法。如果我们排除编辑或预处理源本身,即使我们放弃了可移植性并坚持使用gcc,也无法实现它。来自the reference

  

-include file

     
    

处理文件,好像“#include”文件“”出现作为主要源文件的第一行。 (...)

  

因此,您的redefinition.h将包含在尝试定义CONFLICTINGMACRO的所有其他标头之上。同样适用于-D-U;任何宏重新定义都将遵循最后的一般情况。没有预处理器选项来覆盖这种行为。

另一种方法是复制所有包含的头文件的整个文件树(例如,include / - > include_wrapper /),然后将所有文件修改为以下相同的内容:

#include_next __FILE__
#ifdef CONFLICTINGMACRO
    #undef CONFLICTINGMACRO
#endif
#define CONFLICTINGMACRO(...) {}

然后在其他任何内容之前为它设置include目录(include_wrapper /)。通过这种方式,在每次包含包装头之后,您基本上#undef了宏。当然,你会牺牲可移植性,因为#include_next是一个非常常见的预处理器扩展。