在Visual Studio 2015中定义的NDEBUG和_DEBUG在哪里?

Jon*_*Mee 5 c++ assert visual-studio-2010 visual-studio visual-studio-2015

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

如果我进入默认Visual Studio 2015项目的设置"预处理器定义"为空! Visual Studio 2015项目设置

我甚至没有在Visual Studio 2015 .vcxproj中看到NDEBUG_DEBUG提到过.我知道它是正确定义的,因为assert(false)只在Debug配置中触发.微软在Visual Studio 2015中将这些定义放在哪里?我可以修改它们,还是从我那里取走它?

编辑: 尼尔的答案是正确的.我不明白的是,assert如果在Release配置中触发,则会发生不同的情况.此程序不会弹出assert对话框,但它不会执行以下system("pause")任一操作:

void main() {
    assert(false);
    system("pause");
}
Run Code Online (Sandbox Code Playgroud)

相反,当我在Release配置从Visual Studio我看到控制台窗口弹出,并立即关闭运行它,所以我认为assert不火的原因,我没有看到一个assert对话框.但是,如果我从终端运行已编译的Release可执行文件,它会立即结束,它会输出:

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

因此,断言在发布配置射击,它只是不弹出一个assert对话框.这意味着NDEBUG事实上没有被定义.

Nia*_*all 4

通常,它们被定义为附加预处理器定义/选项的一部分,并最终通过选项开关出现在命令行上/D

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

运行时切换/MD/MT调试版本/MDd/MTd定义它们;特别是_DEBUG. MSDN 文档(此处)提供了更多详细信息。

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

  • 当我将发布“运行时库”切换到“/MDd”时,`NDEBUG` 绝对没有定义,因为我得到了一个断言。然而,当保留为“/MD”时,该程序立即退出;它不会断言,但不会等待`system("pause")`处的按键:`#include <cassert> void main(){assert(false);system("pause");}`这里发生了一些可疑的事情。但是+1让我走上了看起来正确的轨道。 (2认同)