gpt4 book ai didi

Python 函数胶囊

转载 作者:太空宇宙 更新时间:2023-11-03 15:16:18 25 4
gpt4 key购买 nike

我在 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) [...]。我认为这有点像静态 Actor 。类似于 (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这是指向由 PySpam_API[0] 指向的同一函数的指针转换到 int (*)(const char *) , 然后使用 PySpam_System作为取消引用指针的快捷方式,这意味着 PySpam_System可以像函数一样使用,如:

PySpam_System("an example");

这有效地调用了 PySpam_API[0] 指向的函数带参数 "an example" .请注意,该函数必须与转换兼容。

另外,请注意代码定义了一个名为 PySpam_System 的函数在定义宏之前 PySpam_System .如果您使用 PySpam_System(),这会产生这样的效果在 #define 之前,您将调用此函数:

static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;

(扩展为 static int PySpam_System(const char *command); )

如果您使用 PySpam_System()#define之后,您将调用一个调用由 PySpam_API[0] 指向的函数的宏.

关于Python 函数胶囊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20597906/

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