- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 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/
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。 6
我在尝试使用 Gradle 创建胶囊时遇到错误。 Failed to find Premain-Class manifest attribute in E:\Dropbox\Projects\Kotl
我正在构建一个网关,使应用程序的多个实例能够相互通信。为了连接到不同的数据库,我使用了 Laravel 的 Capsule。 当对数据库的请求失败时,我想记录错误,但由于某种原因我无法正确捕获异常。查
我正在我的游戏中编写 C++ 碰撞检测程序,并试图提出一种算法:我有一个由两个中心点(C1、C2)、长度和半径定义的胶囊。然后我有一条用两点(R1,R2)定义的射线。我已经知道它们相交了。我只需要找到
我是一名优秀的程序员,十分优秀!