关于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提供的众多断言相关的宏.
可以拿简单的程序试验:
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决定的.
=======================
事实上, 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; } |
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决定的.
相关文章推荐
- 隐马尔可夫模型(HMM)攻略
- 初探 iOS8 中的 Size Class
- 2015.10华为软件工程师校招面经
- UITableView点击切换状态分析
- C语言宏定义,内置宏,__FILE__,__LINE__,## 用法
- RHEL6.6安装My Eclipse 2015
- 类特殊属性
- JavaScript使ifram跨域相互访问及与PHP通信的实例
- 双目测距的基本原理
- 自定义滚动条mCustomScrollbar
- RTSP协议学习笔记
- HDU 2550 百步穿杨 (水题)
- Javascript进阶篇——( JavaScript内置对象---下)--Array数组对象---笔记整理
- win2012 NTFS文件系统点滴
- iOS开发--storyboard适配pin
- 哲学初步认识
- 【Android】常见面试题(一)
- 企业级Docker应用 第一章 了解Docker
- C#中读取SQLServer数据库方法类库(感觉有点意思就载下来了 )
- linux下使用yum安装jdk、mysql、tomcat、httpd