【发布时间】: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