在看OpenFoam源码的时候突然看到TypeName(“xxx”);这句几乎每个类都有,一开始以为是TypeName(“xxx”)调用构造函数,细看不太对,应该是调用宏定义的函数,这个宏函数原型在$SRC/OpenFOAM/db/typeInfo文件里定义的。
如下:
#define TypeName(TypeNameString) \
ClassName(TypeNameString); \
virtual const word& type() const {return typeName;}
官方注释是:声明了ClassName()用一个纯虚类型的info
ClassName()呢本身也是一个宏定义函数,看一下它的定义
#define ClassName(TypeNameString) \
classNameNoDebug(TypeNameString); \
static int debug
对于ClassName(),官方注释和解释是:add typeName information from argument TypeNameString to a class.
also declares debug information
首先理解宏定义到底是什么,最简单的当然是
#define a 10
#define b a
宏定义是一种简单的语义替换。
它在元编程时有两种风格,如下所示
//第一种,这里identifier是宏的名字,replacement-list是零个或多个标记序列,
//后继的程序文本中所有出现的identifier的地方都会被预处理器展开为相应的replacemen-list
#define identifier replacement-list
//第二种,类似函数的宏,好比"预处理阶段的元函数”
//定义方式如下
#define identifier(a1,a2,...an) replacement-list
在第二种类似函数的宏定义中,其中每一个ai标识符都命名了一个宏形参(macro parameter),当宏名字出现在后继的程序文本中并且后跟合适的实参列表时(argument list),它将被扩充为replacement-list,而且其中每个出现参数的地方都会被替换为用户给出的实参。[1]
综上所述,对于TypeName和ClassName这两个宏,(刚好都是三行),第一行就是identifier,第二行第三行都是它的displacement-list,宏在多行的时候需要用\来连接。(这一点和shell编程很像)
【1】C++模板元编程 David abrahams Aleksey Gurtovoy等 荣耀译