关于assert, _DEBUG 与 NDEBUG

当定义了 _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决定的.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值