您的位置:首页 > 其它

关于assert, _DEBUG 与 NDEBUG

2016-03-03 16:58 183 查看
当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不被编译。

=======================

事实上, assert 是个宏, 它是扩展为什么都不干还是调用一个函数做真正的断言只取决于一个因素:

NDEBUG 定义了, 它就啥事不干.

NDEBUG 没定义, 它就做断言.

与_DEBUG 这个宏的定义与否无关.

那么VC的Debug下为什么要定义一个 _DEBUG呢, 答案是: VC定义_DEBUG有其用途, 它控制其它宏比如 _ASSERTE是的行为, 但与assert 无关, 我这里说的assert是ANSI C标准的assert, 不是泛指VC提供的众多断言相关的宏.

可以拿简单的程序试验:

#include <assert.h>

int main()

{

assert( 0 );

return 0;

}

vcvars32.bat

cl test.cpp && test.exe

cl /D _DEBUG test.cpp && test.exe

cl /D NDEBUG test.cpp && test.exe

注意, 虽然做Windows下开发的会注意到VC编译选项Release版都有一个NDEBUG宏, 但这个宏的引入不是微软特定的, 它是由ANSI C的assert决定的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: