x264_template函数简析

本文简单分析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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值