Python函数胶囊
作者:互联网
我在python 2.7.5的帮助下找到了此代码段,这是有关在使用C和C扩展Python部分中向其他模块公开C-API的章节:为扩展模块提供C API
/* C API functions */
#define PySpam_System_NUM 0
#define PySpam_System_RETURN int
#define PySpam_System_PROTO (const char *command)
// ...
static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;
// ...
static void **PySpam_API;
#define PySpam_System \
(*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])
此片段适用于功能胶囊.胶囊用于在两个模块之间传递功能.
但是,此代码段是什么意思:[…](PySpam_SystemRETURN(*)PySpam_System_PROTO)[…].
我认为这有点像静态演员表.像(int(*)(char s))之类的东西.但是这个结构是什么意思呢?
解决方法:
按照定义,宏PySpam_System扩展为:
(*(int (*)(const char *command)) PySpam_API[0])
基本上是访问PySpam_API [0],将其强制转换为指向接收const char *并返回int的函数的指针,并取消对该指针的引用.
相当于写:
int (*)(const char *command) function_ptr = (int (*)(const char *command)) PySpam_API[0]
#define PySpam_System (*function_ptr)
也就是说,这等效于声明一个变量function_ptr,该变量是指向转换为int(*)(const char *)的PySpam_API [0]所指向的同一函数的指针,然后使用PySpam_System作为取消引用该指针的快捷方式,这意味着PySpam_System可以当作函数使用,如:
PySpam_System("an example");
这有效地调用了PySpam_API [0]指向参数“ example”的函数.请注意,该功能必须与演员表兼容.
另外,请注意,在定义宏PySpam_System之前,代码定义了一个称为PySpam_System的函数.这样的效果是,如果在#define之前使用PySpam_System(),则将调用此函数:
static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;
(将其扩展为静态int PySpam_System(const char * command);)
如果在#define之后使用PySpam_System(),则将调用一个宏,该宏调用PySpam_API [0]指向的函数.
标签:python-c-api,python-extensions,c-3,python 来源: https://codeday.me/bug/20191030/1965114.html