我曾在大学中从事过多个C语言项目,但从未以专业身份使用过。
最近,我开始阅读cpython的源代码,以下语法使我感到困惑:github
PyAPI_FUNC(int) PyToken_OneChar(int);
函数名称前面的部分是什么意思?它是动态构造返回类型的包装器函数吗?
在这种情况下,我什至不知道Google要搜索什么!
答案 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的公共接口的一部分。