我在大学期间参与了多个与C语言相关的项目,但从未在职业能力范围内使用过它。
最近我开始阅读 cpython 的源代码,以下语法使我感到困惑:github
在函数名前面的 PyAPI_FUNC(int) PyToken_OneChar(int);
这部分是什么意思?它是一个包装器函数,可以动态构造返回类型吗?
在这种情况下,我甚至不知道该怎么搜索谷歌!
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
的函数声明为以int
为参数并返回int
的方式,但它可以让编译器在这些类型中嵌入存储信息。如果您有兴趣,可参阅什么是 __declspec ,何时需要使用它?了解更多有关__declspec
指令的信息。另一个PyAPI_FUNC
定义如下:#define PyAPI_FUNC(RTYPE) RTYPE
这将跳过所有内容,仅将上一行展开为:
int PyToken_OneChar(int);
PyToken_OneChar()
和许多其他函数的声明,而不必为每个平台编写(和维护!)不同版本。这是相当高级的东西 - 如果你刚开始学习,不用担心。这是一个C宏定义,允许他们在不同的操作系统平台上执行不同的任务。例如,在Windows上,这将把函数作为DLL公共接口的一部分导出。
#define
定义。 - Charles Srstkapyapi_func
"时,我会得到一系列看起来很有用的链接,比如"Python-Dev - 什么是PyAPI_FUNC和PyAPI_DATA的意思?"——这是关于PyAPI_FUNC
的电子邮件讨论线程的一部分。基本上,你可以搜索那些让你困惑的术语并查看结果。在这种情况下,因为这个名称与普通相反,所以它会显示出有用的数据。如果你在代码中有一个名为LIST的宏定义,那么你的搜索就会更困难。但尝试一个简单的搜索就很容易。 - Jonathan Leffler