【问题标题】:Source files in Release, header files in DebugRelease 中的源文件,Debug 中的头文件
【发布时间】:2013-06-11 11:29:42
【问题描述】:

我们的应用程序似乎出现了一种奇怪的情况。一个 ASSERT 被触发,它应该只在定义了 _DEBUG 的情况下运行,但是当应用程序在发布模式下编译时它正在被评估。

ASSERT 定义在一个头文件中,并被另一个头文件触发,该头文件包含在源文件中。

进一步检查,源文件确实在发布模式下运行(_DEBUG 未定义,NDEBUG 已定义)。但是,头文件定义了 _DEBUG,而不是 NDEBUG。

按照传统观点,#include 一个头文件就等于将代码行剪切并粘贴到源文件中。这将使上述行为变得不可能。

我们正在 VS2010 中编译一个大型的混合语言(英特尔 FORTRAN 和 C++)应用程序。不过,这个问题也出现在我们的构建服务器上,因此它似乎不仅仅是 VS2010 的“功能”。

我们已经检查过:

  1. 所有项目都在 Release 中构建。
  2. 受影响的 cpp 文件没有设置任何异常属性。
  3. 我们的解决方案中没有手动定义或取消定义 _DEBUG 或 NDEBUG 的文件。
  4. 我们通过包含以下条款来确立上述行为:

bool is_debug = false;

#ifdef _DEBUG

is_debug = true

#endif

然后立即打破这一点。

我们已经没有东西可以测试了——我什至可以假设的唯一事情是:

  1. 某些标准库或外部包含正在重新定义 _DEGUG 和 NDEBUG,或者
  2. 某些东西覆盖了#include 宏(这可能吗?)。

编辑 ---------------------------------- ------------

部分感谢#error 技巧(如下),我们发现了直接的问题:在几个项目中,NDEBUG 和_DEBUG 不再定义。所有这些项目都意味着从宏 $(PreprocessorDefinitions) 继承 something - 但这没有在任何地方定义。

这仍然留下一些尴尬的问题:

  1. 导致上述行为的源文件确实在其项目设置中定义了 NDEBUG,但它们包含的头文件没有(尽管 VS2010 确实将正确的 #ifdef 块灰显)。
  2. 如果所有 C++ 项目都继承了 PreprocessorDefinitions 宏(看起来确实如此),那么为什么不在任何地方定义它?

【问题讨论】:

  • 你试过 F12 光标在 _DEBUG 上吗? (转到符号的定义。)
  • 不错的提示,但在这种情况下它找不到定义:-(

标签: c++ debugging header


【解决方案1】:

我通常处理此类问题的方法是,查看符号的定义位置或使用#ifdef,然后将“#error Some text”放入其中。这样编译过程就会中断,而不必等待并运行它。然后你就可以看到真正定义了什么。

您也可以在断言发生的地方添加这样的#ifdef - #error 组合,然后您可以绝对确定编译器认为应该是有效的。

【讨论】:

  • 感谢@Devolus - 我们还没有解决问题,但是这个技巧给了我们更多的证据。看起来好像该头文件的每个包含都以某种方式包含在未定义的 NDEBUG 中。
【解决方案2】:

来自http://msdn.microsoft.com/en-us/library/9sb57dw4(v=vs.71).aspx

断言例程在 C 运行时库的发布版本和调试版本中都可用。另外两个断言宏 _ASSERT 和 _ASSERTE 也可用,但它们仅在定义 _DEBUG 标志时评估传递给它们的表达式。

换句话说:使用 _ASSERT(...) 或 #define NDEBUG,这样您就不会在发布版本中获得断言。

【讨论】:

  • 对不起:我应该更清楚。我们在其中一个头文件中定义 ASSERT,如果定义了 NDEBUG 则将其设置为 null 函数,如果未定义则将其设置为真正的函数。
【解决方案3】:

好的,问题原来是因为几个项目的 Properties->C/C++->Preprocessor->Preprocessor Definitions 中缺少 NDEBUG 和 _DEBUG。它们是否总是丢失,或者它们是否最初是通过 $(PreprocessorDefinitions) 宏包含的尚不清楚。

感谢@Lamza、@Devolus 和@Werner Henze - 他们的所有意见都很有用,最终的问题令人沮丧。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多