我可以转到默认 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 可执行文件它会立即结束,但是它输出:
Assertion failed: false, file temp.cpp, line 9
所以断言是在发布配置中触发,它只是不会弹出assert
对话框。这意味着 NDEBUG
实际上没有被定义。
最佳答案
通常,这些被定义为附加预处理器定义/选项的一部分,并最终通过 /D
选项开关出现在命令行上。
根据项目配置,它们可以从父属性文件继承,因此在项目中可能不会立即可见。
运行时开关 /MD
、/MT
和调试版本 /MDd
和 /MTd
定义了这些还有;特别是 _DEBUG
。 The MSDN documentation (here)对于这些提供了更多详细信息。
根据经验,在NDEBUG
的情况下,测试#ifndef _DEBUG
可能会更好。我通常觉得这样更一致。
关于c++ - NDEBUG 和 _DEBUG 在 Visual Studio 2015 中定义在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33151207/