需要帮助解读C语言语法

3

我在大学期间参与了多个与C语言相关的项目,但从未在职业能力范围内使用过它。

最近我开始阅读 cpython 的源代码,以下语法使我感到困惑:github

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

在这种情况下,我甚至不知道该怎么搜索谷歌!


2
看起来对我来说像是一个宏。透过其他的包含文件,看看是否能找到任何关于它的#define定义。 - Charles Srstka
3
当我在Google搜索"pyapi_func"时,我会得到一系列看起来很有用的链接,比如"Python-Dev - 什么是PyAPI_FUNC和PyAPI_DATA的意思?"——这是关于PyAPI_FUNC的电子邮件讨论线程的一部分。基本上,你可以搜索那些让你困惑的术语并查看结果。在这种情况下,因为这个名称与普通相反,所以它会显示出有用的数据。如果你在代码中有一个名为LIST的宏定义,那么你的搜索就会更困难。但尝试一个简单的搜索就很容易。 - Jonathan Leffler
2个回答

6

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() 和许多其他函数的声明,而不必为每个平台编写(和维护!)不同版本。这是相当高级的东西 - 如果你刚开始学习,不用担心。

4

这是一个C宏定义,允许他们在不同的操作系统平台上执行不同的任务。例如,在Windows上,这将把函数作为DLL公共接口的一部分导出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接