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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值