全局重新定义多个冲突的预处理器定义
redefine multiple conflicting preprocessor definitions globally
我有一个大型项目,其中包含一些冲突的预处理器函数定义,例如:
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
是一个不太常见的预处理器扩展。
相关文章:
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- Visual Studio:snprintf 冲突的宏定义
- 冲突声明/重新定义:不同的基本类型
- 是否有具有用户定义的冲突处理程序的 std::唯一样式库算法
- GCC 6.3.0 中的 ODR 冲突,类型在两个单独的翻译单元中定义
- C++冲突声明的标准定义
- 在Visual Studio中定义与Typedef枚举发生冲突的原因是什么?
- 全局重新定义多个冲突的预处理器定义
- 如何修复与Xtime的Boost和Vs相互冲突的定义有关的编译器错误
- 包含:stdafx.h 和 <vector> VisualStudio 2012 C++ 之间的冲突(错误 C2953:已定义类模板)
- 将使用预处理器指令来定义美元符号表示的内容会导致任何冲突
- C++类型定义与类冲突
- OpenGL重新定义错误与Windows SDK文件相冲突时
- 相同定义变量的部分类型冲突
- directx标头和winerror.h之间的宏定义冲突
- LBNF,C函数声明/定义,减少冲突
- 创建具有自动存储的自定义对象并推送回 std::vector 时访问冲突
- 在调试中有多个定义冲突的c++静态归档库
- 不明确的引用和命名空间(来自两个外部库的定义冲突)