c - 需要帮助破译 C 语法
问题描述
我在大学里做过几个关于 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
为一个以 anint
作为参数并返回 an的函数int
,但它以一种允许编译器将存储信息嵌入这些类型的方式来执行此操作。请参阅什么是 __declspec 以及何时需要使用它?__declspec
如果您有兴趣,可以了解有关该指令的更多信息。另一个定义PyAPI_FUNC
是:
#define PyAPI_FUNC(RTYPE) RTYPE
它跳过了所有这些,只是将上面的行扩展为:
int PyToken_OneChar(int);
因此,要摆脱这一点的主要内容是,旨在在多个平台上编译的源代码通常使用宏,这使得编写一次代码并在每个平台上使用它变得更加容易。在这种情况下,它允许程序员为PyToken_OneChar()
和许多其他函数编写一次声明,而不必为每个平台编写(和维护!)不同的版本。这是相当先进的东西——如果你刚开始,你不应该担心的事情。
推荐阅读
- android - SaveStateHandle ViewModel:保存接口(回调)
- php - 使用 php 和 mysql where 子句填充下拉列表不起作用
- go - 我不能在 Go 中使用指向接口类型的指针吗?
- next.js - 下一个 Image 组件在生产中抛出 404 错误,在开发中工作正常
- vue.js - 在 Vue CLI (Vue3) 中将 VueAnalytics 导入到 main.ts 时出错
- python - 从 Wiki 中获取与特定文本匹配的表格
- c++ - 无法将值从 Qt 推送到 QML
- c# - 如何从字符串值构建表达式树
- javascript - 在 Asp.net core 2.2 中使用 jQuery 比较动态表中的两个值
- synchronization - Synology DS 云应用程序不再在平板电脑上正确同步