【问题标题】:Where are NDEBUG and _DEBUG Defined in Visual Studio 2015?Visual Studio 2015 中的 NDEBUG 和 _DEBUG 定义在哪里?
【发布时间】:2015-10-15 14:28:13
【问题描述】:

我可以转到默认 Visual Studio 2010 项目的设置,查看“配置属性”>>“C/C++”>>“预处理器”的“预处理器定义”中定义的NDEBUG_DEBUG

如果我转到默认 Visual Studio 2015 项目的设置“预处理器定义”为空!

我什至没有在 Visual Studio 2015 .vcxproj 中看到 NDEBUG_DEBUG。我知道它的定义是正确的,因为assert(false) 只在调试配置中触发。 Microsoft 在 Visual Studio 2015 中将这些定义藏在哪里?我可以修改它们吗?还是被我拿走了?

编辑: Niall's answer 是正确的。我不明白的是,如果在发布配置中触发 assert 会发生不同的情况。该程序不会弹出assert 对话框,但也不会执行system("pause")

void main() {
    assert(false);
    system("pause");
}

当我在 Visual Studio 的发布配置中运行它时,我看到控制台窗口弹出并立即关闭,所以我假设 assert 没有触发,因为我没有看到assert 对话框。 但是如果我从终端运行已编译的 Release 可执行文件,它会立即结束,但是它会输出:

断言失败:false,文件 temp.cpp,第 9 行

所以断言 is 在发布配置中触发,它只是不会弹出assert 对话框。这意味着NDEBUG 实际上没有被定义。

【问题讨论】:

  • 那些还在。你是从一个空项目开始的吗?有时,当您从一个空项目开始时,有些东西不会自动生成。
  • @engf-010 第二张图片来自一个空的控制台项目。您可以清楚地看到那些仍然存在。然而,空的控制台项目在 Debug 配置中会在 assert(false) 上触发,但在 Release 配置中不会触发。很明显,任何需要生成的东西都生成了,它不再是可访问的了。
  • 我相信你。我只能说我的标准控制台项目在所有平台和配置的常用位置显示它们。
  • “空控制台项目”没有任何意义。它要么是一个空项目,要么是一个控制台项目。设置来自工程模板,选择 Win32 > Win32 Console Application 即可上手,掉入成功的坑。项目最终由Javascript生成,脚本代码位于C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCWizards\AppWiz\Generic\Application\scripts\1033\default.js
  • @HansPassant 我所说的空控制台项目的意思是创建一个新的控制台项目并在“应用程序设置”对话框中顺便检查“空项目”当我通过这种方法创建一个新的控制台项目时,它确实包括NDEBUG_DEBUG 定义。

标签: c++ visual-studio visual-studio-2010 visual-studio-2015 assert


【解决方案1】:

通常这些被定义为附加预处理器定义/选项的一部分,并最终通过/D 选项开关登陆命令行。

根据项目配置,它们可以从父属性文件继承,因此可能不会立即在项目中可见。

运行时开关/MD/MT 和调试版本/MDd/MTd 也定义了这些;特别是_DEBUGThe MSDN documentation (here) 为这些提供了更多详细信息。

根据经验,在NDEBUG的情况下,测试#ifndef _DEBUG可能会更好。我通常觉得这更一致。

【讨论】:

  • 我也是这么想的,但是它们不在命令行上: /GS /analyze- /W1 /Zc:wchar_t /Zi /Gm- /O2 /Fd"Release\vc140.pdb " /Zc:inline /fp:precise /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\temp. pch"
  • IIRC,运行时开关也可以添加这些,但我不记得所有的细节。我也更新了答案。
  • 那些运行时开关也确实定义了调试符号。
  • 当我将发行版“运行时库”切换到“/MDd”时,NDEBUG 肯定没有定义,因为我得到了一个断言。但是,当保留为“/MD”时,该程序立即退出;它没有断言,但它不会等待system("pause") 的按键:#include <cassert> void main(){assert(false);system("pause");} 这里发生了一些可疑的事情。但是 +1 让我走上了正确的道路。
  • 我已经编辑了这个问题,以澄清为什么这个答案是正确的。
猜你喜欢
  • 2011-01-18
  • 1970-01-01
  • 2018-01-20
  • 2016-01-01
  • 2015-10-28
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多