【问题标题】:Python Function CapsulesPython 函数胶囊
【发布时间】:2014-01-03 01:48:48
【问题描述】:

我在 python 2.7.5 的帮助下找到了这个代码 sn-p,这是在用 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])

此片段用于功能胶囊。胶囊用于在两个模块之间传递函数。 但是这个sn-p是什么意思:[...] (PySpam_SystemRETURN (*)PySpam_System_PROTO) [...]。 我认为这有点像静态演员表。像(int(*)(char s)) 这样的东西。但是这个结构是什么意思呢?

【问题讨论】:

  • 你的意思是capsules
  • 对不起,是的!我已经更正了。

标签: python c python-c-api python-extensions


【解决方案1】:

按照定义,宏 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 的函数。其效果是,如果您在#define 之前使用PySpam_System(),您将调用此函数:

static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;

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

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

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 2012-01-25
    • 2015-07-08
    • 2020-01-01
    • 1970-01-01
    • 2016-01-25
    • 2015-12-29
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多