从LLVM源码学C++(四)

关键知识点:断言

1 const Option OptTable::getOption(OptSpecifier Opt) const {
2   unsigned id = Opt.getID();
3   if (id == 0)
4     return Option(0, 0);
5   assert((unsigned) (id - 1) < getNumOptions() && "Invalid ID.");
6   return Option(&getInfo(id), this);
7 }

断言:(转)http://blog.csdn.net/szlanny/article/details/4267862

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

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

[c-sharp] view plaincopy

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

assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
大家要注意是,其中的表达式为假时,会终止程序运行,包括我在内经常会写错代码,断言一个指针是否为空,往往写成了
assert(!p);其实应该写成assert(p);
assert是运行期的判断,并且会强制终止程序,一般要求只能用于debug版本中,是为了尽可能快的发现问题。尤其在我所从事的电信软件产品中,assert是要从release版本中去掉。所以一般开发会重新定义assert宏。

2)静态断言,在新的C++标准中C++0x中,加了对静态断言的支持,引入了新的关键字static_assert来表示静态断言。使用静态断言,我们可以在程序的编译时期检测一些条件是否成立。但这个关键字太新了,没有几个编译器是支持的(好像VC2008支持,我用VC很少,主要是在linux下C++编程)。于是可以使用C++现有的模板特性来实现静态断言的功能。boost中也已有BOOST_STATIC_ASSERT宏的实现,有兴趣的同学可以down下来仔细研究一下,它的断言信息更丰富,下面为我的简单实现:

[c-sharp] view plaincopy

  1. // declare a tempalte class StaticAssert.
  2. template <bool assertion> struct StaticAssert;
  3. // only partial specializate parameter‘s value is true.
  4. template <> struct StaticAssert<true>
  5. {
  6. enum { VALUE = 1 };
  7. };
  8. #define STATIC_ASSERT(expression) (void)StaticAssert<expression>::VALUE

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

[c-sharp] view plaincopy

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

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

从LLVM源码学C++(四),布布扣,bubuko.com

时间: 2024-10-11 18:50:38

从LLVM源码学C++(四)的相关文章

从LLVM源码学C++(一)

今天开始需要分析clang的源码了,LLVM这个开源的project代码写的很不错的,也算是巩固一下C++的一些基础知识了. 首先是在llvm/ADT/OwningPtr.h中定义了owningptr智能指针的实现: 源码如下: 1 /// OwningPtr smart pointer - OwningPtr mimics a built-in pointer except that it 2 /// guarantees deletion of the object pointed to,

从LLVM源码学C++(五)

知识点:static,const,static const 详解:转(http://blog.csdn.net/yjkwf/article/details/6067267) const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的具体对象相关的.即使没有具体对象,也能调用类的静态成员函数和成员变量.一般类的静态函数几乎就是一个全局函数,只不过它的作用域限

从LLVM源码学C++(三)

关键知识点:mutable关键字 mutable关键字: mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mut

从LLVM源码学C++(二)

在看Clang源码的过程中遇到过,返回const引用,于是就去google 了一下返回值以及参数传递等相关的知识. 首先,为什么要(const 引用)的返回值? 首先&的引用作用是C++独有的特性.其作用相当于传入参数时不经过拷贝,而是实实在在的传入. fun(int &a).如果在函数内部修改了a的值,那就确实修改了a的值.而一般的参数传入方式都是传入一个参数的副本.函数内部的操作都是作用于副本. 对于返回值,也类似.一般返回值也是返回的拷贝值.所以如果将函数内的局部变量以引用方式返回是

从LLVM源码学C++(六)

今天看clang的有关DeclSpec.h,看到有关关键字的一些信息.这里总结一下 知识点:各种关键字 C++关键字(static/register/atuo/extern/volatile/const)释疑 下面关于C++的几个关键字是经常和我们打交道的而我们又经常对这些含糊不清的, 本文根据自己的学习体会作以总结,以期达到真正理解和活用的目的. static 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值. 静态变量或静态函数,即只有本文件

[Android]Volley源码分析(四)

上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的. Network部分的类图: Network有一个实现类BasicNetwork,它有一个mHttpStack的属性,实际的网络请求是由这个mHttpStack来进行的,看BasicNetwork的performRequest()方法, 1 @Override 2 public NetworkResponse performRequest

【原】AFNetworking源码阅读(四)

[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDelegate类所实现的NSURLSession相关的代理方法,甚至连dataTask.uploadTask.downloadTask这几个基本概念也没说.这一篇就是为了集中消灭这些遗留问题. 2. AFURLSessionManagerTaskDelegate的代理方法 此处实现的仍然是NSURLS

Spark源码系列(四)图解作业生命周期

这一章我们探索了Spark作业的运行过程,但是没把整个过程描绘出来,好,跟着我走吧,let you know! 我们先回顾一下这个图,Driver Program是我们写的那个程序,它的核心是SparkContext,回想一下,从api的使用角度,RDD都必须通过它来获得. 下面讲一讲它所不为认知的一面,它和其它组件是如何交互的. Driver向Master注册Application过程 SparkContext实例化之后,在内部实例化两个很重要的类,DAGScheduler和TaskSched

live555源码研究(四)------UserAuthenticationDatabase类

一.UserAuthenticationDatabase类作用 1,用户/密码管理 2,鉴权管理 二.类UserAuthenticationDatabase继承关系图                         live555源码研究(四)------UserAuthenticationDatabase类,布布扣,bubuko.com