在学习源码时,看到了这样一个宏:
OZ(ObExprExtraInfoFactory::alloc(allocator, type, copied_info));
点进去发现其定义如下:
#define OZ(func, …) OC_I5(func, OC_I4(VA_ARGS))
其中OC_I5和OC_I4的定义分别为:
#define OC_I5(func, a)
do {
if (OB_SUCC(ret)) {
if (OB_FAIL(func)) {
LOG_WARN("fail to exec "#func,
LST_DO(KK, (,), a));
}
}
} while(0)
#define OC_I4(…) ret, ##VA_ARGS
发现OC_I5的宏就是做一次do模块内的语句,既然是这样为什么要写成do{} while()
而不是直接写成一次?求助各位大佬!