5

我在 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))。但是这个结构的意义是什么?

4

1 回答 1

6

按照定义,宏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]casted to指向的同一函数的指针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]

于 2014-06-09T14:25:08.057 回答