【问题标题】:Find out what #define statements conflict between .h files找出 .h 文件之间的 #define 语句冲突
【发布时间】:2014-10-15 16:04:34
【问题描述】:

我在 VS2013,C++ 控制台应用程序中。我在将 boost 集成到大型框架中时遇到问题。如果我尝试将它们集成到空白控制台应用程序中,它们可以正常工作。一旦我包含框架的“根” .h 文件(其中包括交易中的“许多”其他 .h 文件),它就会中断。这些 .h 文件“污染”了 boost 文件(以及之后包含的任何内容,结果参差不齐,不,我不能只首先包含 boost 文件,不幸的是,这并不总是一种选择)。我发现至少有一个根级#define 干扰并导致编译错误,但我找不到其他一些导致运行时问题的冲突。

具体来说,我的问题是:如何判断 .h 文件定义了哪些符号?希望以后会发生哪些冲突?我尝试使用谷歌搜索,但找不到执行此操作的工具。

或者是否有其他方法可以“隔离”它们(我的问题 .h 文件),但仍然让它们正确链接到它们在其他 .dll 中调用的函数?

【问题讨论】:

  • 可能是一些静态代码分析工具(如 PVS-Studio)可以帮助您。但我不确定。
  • 预编译头文件的生成是否会提供此信息?不确定在这种情况下 .pch 文件的格式是什么,但如果它基于文本,也许你可以在输出之间执行差异
  • @PetrPervukhin - 是的,这就是我的想法,但从未使用过任何类似的工具,我希望得到更具体的建议,和/或如何配置这样的工具来获得该输出.

标签: c++ boost visual-studio-2013 boost-preprocessor


【解决方案1】:

您可以将g++ -E 用作静态代码检查工具(无需更改您的工具集)。它能够告诉您什么时候重新定义,但不能告诉您 #define 被用作另一个名称(它无法判断它是否是真正的替换)。

如果这不是问题的根源,那么您可能需要采取更全面的方法:开始将项目的 #define 使用更改为其他构造,例如 const 和 short 函数。这将允许编译器通过重载来解决差异或抱怨存在冲突。

【讨论】:

  • 正如我在第一行中所说,使用 Visual Studio。切换到 gcc 不是可选的(这是为了工作)。这是我最初在这里使用的“不小的”框架,因此切换事物是数千(如果不是数千)行的工作。
  • @Kevin Anderson 我更新了我的答案,但我只是说使用 g++ 作为静态代码检查工具(仅限预编译),而不是更改您的工具链。
【解决方案2】:

再次包含相同的头文件可能会导致问题,您可以为每个头文件创建一个符号,这样如果该头文件已经包含在其他头文件中,则不应包含它。

#ifndef
#define __header_file_name_H
.....some code
#endif

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多