首页 > 解决方案 > 需要帮助破译 C 语法

问题描述

我在大学里做过几个关于 C 的项目,但从未以专业身份使用它。

最近我开始阅读 cpython 的源代码,下面的语法让我很困惑:github

函数名前面的部分是什么PyAPI_FUNC(int) PyToken_OneChar(int);意思?它是动态构造返回类型的包装函数吗?

在这种情况下,我什至不确定谷歌搜索什么!

标签: ccpython

解决方案


PyAPI_FUNC() 是 pyport.h 中定义的宏。具体定义取决于您正在构建的平台,但这里有一个示例:

#define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE

因此,您的问题中的行PyAPI_FUNC(int) PyToken_OneChar(int);扩展为:

__declspec(dllimport) int PyToken_OneChar(int);

基本上,它只是将名称声明PyToken_OneChar为一个以 anint作为参数并返回 an的函数int,但它以一种允许编译器将存储信息嵌入这些类型的方式来执行此操作。请参阅什么是 __declspec 以及何时需要使用它?__declspec如果您有兴趣,可以了解有关该指令的更多信息。另一个定义PyAPI_FUNC是:

#define PyAPI_FUNC(RTYPE) RTYPE

它跳过了所有这些,只是将上面的行扩展为:

int PyToken_OneChar(int);

因此,要摆脱这一点的主要内容是,旨在在多个平台上编译的源代码通常使用宏,这使得编写一次代码并在每个平台上使用它变得更加容易。在这种情况下,它允许程序员为PyToken_OneChar()和许多其他函数编写一次声明,而不必为每个平台编写(和维护!)不同的版本。这是相当先进的东西——如果你刚开始,你不应该担心的事情。


推荐阅读