在Linux内核、嵌入式代码等传统的C代码里,会有一些难以识别的宏定义。我记得在eCos, UBoot, FFmpeg有一些比较BT的宏定义,很难读懂。对于C++程序员来说,最好将这种难读的宏定义转成inline函数或模板函数。本章对这些较难的重定义进行汇总。
1. 在宏定义中指定义类型参数
#define FPOS_TO_VAR(fpos, typed, var) (var) = (typed)((fpos).__pos)
#define VAR_TO_FPOS(fpos, var) (fpos).__pos = (var)
此句在faac的代码里可以见到,其特殊之处是以类型名作为参数,而且是用宏定义一行赋值语句。像如下的调用:
uint64_t ret;
FPOS_TO_VAR(fpos, uint64_t, ret);
相当于
uint64_t ret;
ret = (uint64_t) (fpos.__pos);
一般可以对宏定义作换行显示,换行后会更清晰易懂一些:
#define FPOS_TO_VAR(fpos, typed, var) \
(var) = (typed)((fpos).__pos)
2. 宏定义取结构偏移
这种用法似乎在uCosII中用到,记不清了。举例来说,我们知道一个struct(类型为T)中有一个变量为v,那么由v的地址来得到T的指针呢?