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

redefine multiple conflicting preprocessor definitions globally

本文关键字:定义 冲突 处理器 预处理 新定义 全局      更新时间:2023-10-16

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

1.h:

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

2.h:

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

有些文件同时导入两个标头,但找到了错误的定义(首先加载的定义)。

我在一个名为recdefinitions.h 的文件中重新定义了项目的其他符号(例如,Linux上不可用的Windows功能和类型)

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

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

为了快速简单地调试其他功能(我现在不需要冲突的宏),我尝试在重新定义中添加以下行。h:

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

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

你对我如何为整个项目全局覆盖项目不同头文件中定义的宏有什么想法吗?

没有简单的方法。如果我们排除了对源本身进行编辑或预处理的可能性,那么即使我们放弃了可移植性并坚持使用gcc,也不可能实现这一点。参考:

-包括文件

将文件处理为"#include"file"作为主源文件的第一行出现。(…)

因此,您的redefinition.h将包含在尝试定义CONFLICTINGMACRO的其他标头之上。-D-U也是如此;任何宏的重新定义都将遵循最后一次的定义。没有预处理器选项可以覆盖这样的行为。

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

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

然后为它设置include目录(include_wapper/),然后再设置其他目录。通过这种方式,您基本上是在每次包含换行的头之后对宏执行#undef操作。当然,您将牺牲可移植性,因为#include_next是一个不太常见的预处理器扩展。