在学习ob底层的数据类型实现时,看到这样定义一个数组的方式:
const ObObjTypeClass OBJ_TYPE_TO_CLASS[ObMaxType] =
{
LST_DO(SELECT_TC, (,), OBJ_TYPE_TC_PAIRS)
};
关于SELECT_TC
宏的定义如下:
#define SELECT_SECOND(x, y) y
#define SELECT_TC(arg) SELECT_SECOND arg
我的疑问点:
正常如果定义了宏#define SELECT_TC(arg) SELECT_SECOND arg
,那么使用方式不应该是SELECT_TC(...)
这样的形式吗,为什么这里的直接使用SELECT_TC
。求助各位大佬解惑。
SELECT_TC这是个专用的宏,要结合这里的LST_DO来用,所以你看下面它又把SELECT_TC给undef掉了
LST_DO比较难理解,是一种比较高阶的宏技巧,定义你可以看deps/oblib/src/lib/utility/ob_macro_utils.h自己学习下
这里你只需要知道
LST_DO(SELECT_TC, (,), arg1, arg2, arg3…)
会展开成
SELECT_TC(arg1), SELECT_TC(arg2), SELECT_TC(arg3), …
也就是
SELECT_SECOND arg1, SELECT_SECOND arg2, SELECT_SECOND arg3, …
由于arg是OBJ_TYPE_TC_PAIRS展开的,类似
(ObNullType, ObNullTC) (ObTinyIntType, ObIntTC) 这样带括号的二元组
因此最终是
SELECT_SECOND(ObNullType, ObNullTC), SELECT_SECOND(ObTinyIntType, ObIntTC)…
也就是ObNullType,ObIntTC,ObIntTC…
也就是说,费了半天劲,OBJ_TYPE_TC_PAIRS第一列是没用的
我猜想这么写的原因大概是为了方便阅读,可以随时方便地查阅type和class的对应关系,而无需一个个去数type对应的类型在第几行……
1 个赞