关于ob_obj_type.h文件中的SELECT_TC宏的理解

在学习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 个赞

明白了,感谢大佬!