C++宏定义函数

在看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等 荣耀译

你可能感兴趣的:(C++,openfoam)