封装的宏定义MCHECK如下(摘自muduo网络库):
#ifdef NDEBUG
__BEGIN_DECLS
extern void __assert_perror_fail (int errnum,
const char *file,
unsigned int line,
const char *function)
noexcept __attribute__ ((__noreturn__));
__END_DECLS
#endif
#define MCHECK(ret) ({ __typeof__ (ret) errnum = (ret); \
if (__builtin_expect(errnum != 0, 0)) \
__assert_perror_fail (errnum, __FILE__, __LINE__, __func__);})
#else
说明:
-
typeof:是gcc的扩展,一般用于声明变量并自动推举其类型,如示例中表示用errnum来声明ret并获取其实际类型;
-
__builtin_expect:作用是允许程序员将最有可能执行的分支告诉编译器,主要用来生成高效的代码。一般使用的格式为:
# 表示EXP==N的概率很大
__builtin_expect(EXP, N)
- attribute:该函数中attribute可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)