需要帮助来解密C语法

时间:2018-10-02 00:26:50

标签: c cpython

我曾在大学中从事过多个C语言项目,但从未以专业身份使用过。

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

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

在这种情况下,我什至不知道Google要搜索什么!

2 个答案:

答案 0 :(得分:3)

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的函数,但是这样做的方式是让编译器嵌入具有这些类型的存储信息。如果您有兴趣,请参见What is __declspec and when do I need to use it?,以获取有关__declspec指令的更多信息。 PyAPI_FUNC的另一个定义是:

#define PyAPI_FUNC(RTYPE) RTYPE

跳过所有内容,只是将上面的行扩展为:

int PyToken_OneChar(int);

因此要摆脱的主要问题是,要在多个平台上进行编译的源代码经常使用宏,这些宏使编写一次代码并在每个平台上使用它更加容易。在这种情况下,它使程序员可以一次为PyToken_OneChar()和许多其他函数编写声明,而不必为每个平台编写(和维护!)不同的版本。这是相当高级的东西-如果您入门,则不必担心。

答案 1 :(得分:1)

这是他们编写的C宏,它允许他们在不同的OS平台上执行不同的操作,例如在Windows上,这会将功能导出为DLL的公共接口的一部分。