转载请注明出处:http://blog.csdn.net/luotuo44/article/details/38780157
Libevent定义了一系列的可移植的兼容类型和函数。这使得在各个系统上都有一致的效果,Libevent一般都会在兼容通用类型和函数的前面加上ev或evutil前缀。
在实现上,Libevent都是使用条件编译+宏定义的方式。使用这种方式,同一个宏名字,可以使得在不同的系统上, 编译时得到不同的值。这种方式在跨平台编程中,经常使用到。此外,对于Libevent的兼容类型,如果所在系统已经有对应功能的类型,那么Libevent将直接将ev_XXX宏的值定义为该类型。如果所在系统没有对应的类型,那么就会选择一个比较合理的类型作为宏值。
兼容类型:
定长位宽类型:
因为,C/C++中,整型int的位宽(多少bit)是没有限定的,而在有的时候却需要一个确定的长度。在C99标准中有一个stdint.h头文件定义了一些确定位宽的整型,如int64_t、int32_t。但Libevent考虑到可能有的环境并没有支持这个头文件,所以自己就定义了自己的一套确切位宽的整型。
在util.h文件的一开始,就定义了一些通用的位宽确定的整数类型。如下:
#ifdef _EVENT_HAVE_UINT64_T
#define ev_uint64_t uint64_t
#define ev_int64_t int64_t
#elif defined(WIN32)
#define ev_uint64_t unsigned __int64
#define ev_int64_t signed __int64
#elif _EVENT_SIZEOF_LONG_LONG == 8
#define ev_uint64_t unsigned long long
#define ev_int64_t long long
#elif _EVENT_SIZEOF_LONG == 8
#define ev_uint64_t unsigned long
#define ev_int64_t long
#elif defined(_EVENT_IN_DOXYGEN)
#define ev_uint64_t ...
#define ev_int64_t ...
#else
#error "No way to define ev_uint64_t"
#endif
从代码中可以看到,它最先考虑当前环境是否已经定义了64位宽的整型,如果有的话,就直接使用。然后再考虑是否在Windows系统、是否定义了_EVENT_SIZEOF_LONG_LONG,并且值为8 ……
正如《event-config.h指明所在系统的环境》博文所说的,像_EVENT_HAVE_UINT64_T、_EVENT_SIZEOF_LONG_LONG这些宏定义都是在Libevent检测系统环境时定义的。
Libevent定义了一系列位宽的整型,如下图:
表来自http://www.wangafu.net/~nickm/libevent-book/Ref5_evutil.html
其最值是直接计算出来的,如下:
#defi