gpt4 book ai didi

c - #define DEVMETHOD(id, func) id : func found this in a header file , ":"这里的作用是什么?

转载 作者:行者123 更新时间:2023-12-02 17:11:50 24 4
gpt4 key购买 nike

#define DEVMETHOD(id, func) id: func

我正在查看 ocf-crypto 的源代码,发现了一个奇怪的宏。“:”运算符在这里的作用是什么以及它实际的作用是什么?

美国是

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))

来电

CRYPTODEV_NEWSESSION(cap->cc_dev, &lid, cri)

最佳答案

语法fieldname: value是GCC特定的designated initialiser 。此语法被认为已过时。宏替换后的结构体:

    static device_method_t talitos_methods = {
cryptodev_newsession: talitos_newsession,
cryptodev_freesession: talitos_freesession,
cryptodev_process: talitos_process,
};

可以使用标准 C99 初始化程序重写:

    static device_method_t talitos_methods = {
.cryptodev_newsession = talitos_newsession,
.cryptodev_freesession = talitos_freesession,
.cryptodev_process = talitos_process,
};

该结构本身是设备的接口(interface)。通过这个结构体,每个设备都可以实现自己的接口(interface)。这是在 C 中实现一种多态性的一种方法。

第二个宏实现对设备函数的调用。当然,函数必须知道要在哪个设备上操作,因此宏确保使用相同的 dev 来从接口(interface)查找正确的函数并作为函数的参数。 (这可以写成函数而不是宏,从而仅评估 dev 一次。)

关于c - #define DEVMETHOD(id, func) id : func found this in a header file , ":"这里的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35843312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com