Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315175
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2008-04-11 09:35:55

忍不住要写一下 _DEBUG与 NDEBUG是因为在网上看到一篇解释这个问题的文章很广泛被引用, <<vc下debug 版本和release版本的区别>>:

有多广泛? google说:

约有114,000项符合vc下debug 版本和release版本的区别的查询结果,以下是第1-10项 (搜索用时 0.36 秒)

该文中对_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决定的.
阅读(7244) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~