本文简单分析x264代码当中使用的x264_template函数
开头先贴上一段x264中使用template函数的代码,x264中用了非常多template函数,不熟悉宏定义语法的同学可能和我一样一开始不清楚这样做的目的是什么,希望这篇文章能抛砖引玉。
#define x264_glue3_expand(x,y,z) x##_##y##_##z
#define x264_glue3(x,y,z) x264_glue3_expand(x,y,z)
#define x264_template(w) x264_glue3(x264, BIT_DEPTH, w)
#define x264_nal_encode x264_template(nal_encode)
先简要介绍一下C语言宏定义的字符串连接操作
预处理器中的粘合剂:## 运算符。
##运算符出现的场景是,当我们希望把宏定义输入的两部分字符串连接成一个字符,而且希望中间没有空格的。例如我在上面的代码中x264_glue3_expand(x,y,z)输入了x,y,z,我希望最终得到的值是x_y_z,直接相连。这个时候就需要使用##运算符,它会强制把两边的字符串直接concatenate到一起。
举个栗子:
#define Def1(name, type) type name_##type##_type
#define Def2(name, type) type name##_##type##_type
Def1(a1, int); /* 等价于: int name_int_type; */
Def2(a1, int); /* 等价于: int a1_int_type; */
解释:
1)因为宏定义里给的名字是name以及type,而后面代码中name_以及_type都不是name或者type,不能进行替换,只有中间的type可以进行替换,而后经过粘合##两端的字符串,Def1结

最低0.47元/天 解锁文章
844

被折叠的 条评论
为什么被折叠?



