蘭陵N梓記

一指流沙,程序年华


  • 首页

  • 归档

  • 关于

  • 搜索
close

c++技巧之断言Assert

时间: 2009-06-14   |   分类: 技术     |   阅读: 953 字 ~2分钟

断言的应该是一种编程的常见技巧。我所应用的断言有两种,一种是动态断言,即大家所熟知的C标准库的assert()宏,一种是C++中的静态断言,即在编译期间检查。

动态断言

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include <assert.h>  
void assert( int expression );

assert的作用是先计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。

大家要注意是,其中的表达式为假时,会终止程序运行,包括我在内经常会写错代码,断言一个指针是否为空,往往写成了 assert(!p);其实应该写成assert(p);。

assert是运行期的判断,并且会强制终止程序,一般要求只能用于debug版本中,是为了尽可能快的发现问题。尤其在我所从事的电信软件产品中,assert是要从release版本中去掉。所以一般开发会重新定义assert宏。

静态断言

在新的C++标准中C++0x中,加了对静态断言的支持,引入了新的关键字static_assert来表示静态断言。

使用静态断言,我们可以在程序的编译时期检测一些条件是否成立。但这个关键字太新了,没有几个编译器是支持的(好像VC2008支持,我用VC很少,主要是在linux下C++编程)。

于是可以使用C++现有的模板特性来实现静态断言的功能。boost中也已有BOOST_STATIC_ASSERT宏的实现,有兴趣的同学可以down下来仔细研究一下,它的断言信息更丰富,下面为我的简单实现:

// declare a tempalte class StaticAssert.  
template <bool assertion> struct StaticAssert;  

// only partial specializate parameter's value is true.  
template <> struct StaticAssert<true> {  
  enum { VALUE = 1 };  
};

#define STATIC_ASSERT(expression) (void)StaticAssert<expression>::VALUE  

原理是,先声明一个模板类,但后面仅仅偏特化参数值为true的类,而为false的类则一个未定义的类,即是一个未完整的类型,编译期间无法找到StaticAssert<false>::VALUE类型。举例如下:

STATIC_ASSERT(4 == sizeof(long) ); //在 32bit机上OK  
STATIC_ASSERT(4 == sizeof(long) ); //在 64bit机上NG,long为8字节

静态断言在编译时进行处理,不会产生任何运行时刻空间和时间上的开销,这就使得它比assert宏具有更好的效率。另外比较重要的一个特性是如果断言失败,它会产生有意义且充分的诊断信息,帮助程序员快速解决问题。

#c++#
c++实现的queue
c++技巧之宏Macro应用
微信扫一扫交流

标题:c++技巧之断言Assert
作者:兰陵子
关注:lanlingthink(览聆时刻)
声明:自由转载-非商用-非衍生-保持署名(创作共享3.0许可证)

  • 文章目录
  • 站点概览
兰陵子

兰陵子

Programmer & Architect

164 日志
4 分类
57 标签
GitHub 知乎
    • 动态断言
    • 静态断言
© 2009 - 2022 蘭陵N梓記
Powered by - Hugo v0.101.0
Theme by - NexT
0%