我可以访问默认Visual 2010项目的设置,并查看“配置属性”(Configuration Properties)、C/C++“>>”预处理器“的预处理定义”中定义的NDEBUG或_DEBUG:

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

我甚至没有在Visual 2015 NDEBUG中看到任何提到_DEBUG或_DEBUG的地方。不过,我知道它的定义是正确的,因为assert(false)只在调试配置中触发。微软在Visual 2015中把这些定义藏在哪里了?我是否有可能修改它们,或者它是否已经从我身上夺走了?
编辑: 尼尔的回答是正确的。我不明白的是,如果在发行版配置中触发了assert,情况就会有所不同。这个程序不会弹出一个assert对话框,但它也不会执行system("pause"):
void main() {
assert(false);
system("pause");
}相反,当我在Visual的发布配置中运行它时,我会看到控制台窗口弹出并立即关闭,因此我假设assert没有启动,因为我没有看到assert对话框。但是,如果我从终端运行已编译的发布可执行文件,它将立即结束,但它会输出:
断言失败: false,文件temp.cpp,第9行
所以断言是在发布配置中触发的,它只是没有弹出一个assert对话框。这意味着NDEBUG实际上没有被定义。
发布于 2015-10-15 17:13:51
通常,它们被定义为附加的预处理器定义/选项的一部分,并最终使用/D选项开关在命令行上着陆。
根据项目配置的不同,可以从父属性文件继承它们,因此可能无法立即在项目中看到它们。
运行时切换/MD、/MT以及调试版本/MDd和/MTd也定义它们;在particlar中定义_DEBUG。MSDN文档(这里)为这些提供了更多细节。
根据经验,在NDEBUG的情况下,测试#ifndef _DEBUG可能会更好。我觉得这是比较一致的。
https://stackoverflow.com/questions/33151207
复制相似问题