libevent札记 - 代码技巧

阅读了Libevent(version:libevent-2.0.1-alpha)的源码,为了随时能翻阅,这里讲下阅读过程中注意到的代码技巧
原文链接

1.多平台代码

size_t 用size_t来表示最大可表示的整形,在32位,及64位保证不可溢出

typedef unsigned int size_t; (Win32)
typedef unsigned __int64 size_t; (Win64)

2.宏定义

在libevent中基本随处可见宏定义,下面总结一些源码阅读分析中遇到的源定义

2.1 时间减运算

#define evutil_timersub(tvp, uvp, vvp)                  \
    do {                                \
        (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;      \
        (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;   \
        if ((vvp)->tv_usec < 0) {               \
            (vvp)->tv_sec--;                \
            (vvp)->tv_usec += 1000000;          \
        }                           \
    } while (0)

2.2 可扩展性,时间大小比较

if (evutil_timercmp(tv, &base->event_tv, >=))
#define evutil_timercmp(tvp, uvp, cmp)                  \
    (((tvp)->tv_sec == (uvp)->tv_sec) ?             \
     ((tvp)->tv_usec cmp (uvp)->tv_usec) :              \
     ((tvp)->tv_sec cmp (uvp)->tv_sec))

2.3 判断条件中的宏定义

如判断EVBASE是否有锁

if (EVBASE_USING_LOCKS(base))
...
/** True if the given event_base is set up to use locking */
#define EVBASE_USING_LOCKS(base)            \
    (base != NULL && (base)->th_base_lock != NULL)

3.兼容性

3.1 C与C++

#ifdef __cplusplus
extern "C" {
#endif

你可能感兴趣的:(C和CPP)