Libevent源码分析-----通用类型和函数

本文详细分析了Libevent如何通过条件编译和宏定义实现跨平台的兼容类型和函数,包括定长位宽类型、有符号size_t、偏移类型、socket类型、socklen_t类型、指针类型以及相关的时间、socket API函数和结构体偏移量计算。Libevent在不同系统上提供一致的行为,确保在各种环境下稳定工作。
摘要由CSDN通过智能技术生成

        转载请注明出处: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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值