关于ob_define.h文件中宏OC_I5的理解

在学习源码时,看到了这样一个宏:

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()而不是直接写成一次?求助各位大佬!

另外在问一下,我看到OZ宏上方写了注释如下所示:

This better be the last macro we ever need to define in the
O-series, hence ‘Z’.

我想知道的是有没有相关文章专门介绍O系列的不同宏的作用都是什么啊?

用do while也是一种习惯,可以把一些变量等的作用域限制在某个区域不对外暴露。
还可以让C程序员们非常习惯的在语句最后加一个分号’;’

第二个问题看起来是历史原因,仅通过这个无法知道真实的原因。个人猜测这个宏不好写,根据实际情况调整了很多次

1 个赞

感谢大佬