Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
#定义DEVMETHOD(id,func)和#x9;id:func在头文件中找到了该文件,它的角色是什么&引用;在这里_C - Fatal编程技术网

#定义DEVMETHOD(id,func)和#x9;id:func在头文件中找到了该文件,它的角色是什么&引用;在这里

#定义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_

我正在浏览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_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,
    };