#定义DEVMETHOD(id,func)和#x9;id:func在头文件中找到了该文件,它的角色是什么&引用;在这里
我正在浏览ocf crypto的源代码,发现了一个奇怪的宏。 “:”操作员的角色是什么?它实际做什么 用途是#定义DEVMETHOD(id,func)和#x9;id:func在头文件中找到了该文件,它的角色是什么&引用;在这里,c,C,我正在浏览ocf crypto的源代码,发现了一个奇怪的宏。 “:”操作员的角色是什么?它实际做什么 用途是 #define DEVMETHOD(id, func) id: func 再来一个宏 typedef struct { int (*cryptodev_newsession)(device_t dev, u_int32_t *sidp, struct cryptoini *cri); int (*cryptodev_freesession)(device_t dev, u_int64_
#define DEVMETHOD(id, func) id: func
再来一个宏
typedef struct {
int (*cryptodev_newsession)(device_t dev, u_int32_t *sidp, struct cryptoini *cri);
int (*cryptodev_freesession)(device_t dev, u_int64_t tid);
int (*cryptodev_process)(device_t dev, struct cryptop *crp, int hint);
int (*cryptodev_kprocess)(device_t dev, struct cryptkop *krp, int hint);
} device_method_t;
static device_method_t talitos_methods = {
/* crypto device methods */
DEVMETHOD(cryptodev_newsession, talitos_newsession),
DEVMETHOD(cryptodev_freesession,talitos_freesession),
DEVMETHOD(cryptodev_process, talitos_process),
};
电话
#define CRYPTODEV_NEWSESSION(dev, sid, cri) \
((*(dev)->methods.cryptodev_newsession)(dev,sid,cri))
语法
fieldname:value
是特定于GCC的。这种语法被认为是过时的。宏替换后的结构:
CRYPTODEV_NEWSESSION(cap->cc_dev, &lid, cri)
可以使用标准C99初始化器重写:
static device_method_t talitos_methods = {
cryptodev_newsession: talitos_newsession,
cryptodev_freesession: talitos_freesession,
cryptodev_process: talitos_process,
};
结构本身是设备的接口。通过这种结构,每个设备都可以实现自己的接口。这是在C中实现一种多态性的方法
第二个宏实现对设备函数的调用。当然,函数必须知道要在哪个设备上操作,因此宏确保相同的
dev
用于从接口查找正确的函数以及作为函数的参数。(这可能是作为函数而不是宏编写的,因此只能对dev
求值一次。)您确定cryptodev\u newsession
是函数名吗?我猜talitos_newsession
应该是一个函数名。谢谢,请检查@haccks的上述编辑
static device_method_t talitos_methods = {
.cryptodev_newsession = talitos_newsession,
.cryptodev_freesession = talitos_freesession,
.cryptodev_process = talitos_process,
};