【问题标题】:redefine multiple conflicting preprocessor definitions globally全局重新定义多个冲突的预处理器定义
【发布时间】:2017-11-09 10:33:45
【问题描述】:

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

1.h:

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

2.h:

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

有些文件同时导入了两个标题,但发现错误的定义(最先加载的那个)。

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

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

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

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

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

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

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

【问题讨论】:

  • 大概你不能自己编辑文件1.h2.h
  • 不幸的是,这些冲突分散在数千个文件中(不要问为什么,我自己仍然对这种混乱感到有些惊讶......)并编辑它们甚至编写脚本编辑需要相当长的时间(当然,这是将来必须要做的事情)。
  • 我无法告诉编译器忽略特定的(例如按名称)宏定义。

标签: c++ c-preprocessor


【解决方案1】:

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

-包含文件

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

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

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

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

然后先为其设置包含目录(include_wrapper/)。通过这种方式,您基本上是在每次包含包装的标头之后#undefing 宏。当然你会牺牲可移植性,因为#include_next 是一个相当不常见的预处理器扩展。

【讨论】:

  • 如果我之前只看到你的答案。与此同时,我开始编写一个 pyhon 脚本,用于编辑定义语句。伙计……有冲突的宏是不够的,不,它们中的大多数都分布在多行中,格式遵循没有可识别的模式,因此您无法进行简单的替换……处理此代码的人声称它可以用 VisualC++ 很好地编译。我是说,真的吗?!无论如何,谢谢你,如果我的脚本编写时间太长,我会试试你的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多