什么是 .ch 文件?

1 c file header-files

在查看 CPython 源代码时,我发现了一个名为listobject.ch的文件。我不确定这个文件扩展名“.ch”是什么。该文件混合了函数原型和函数定义。是否有理由将 .c 添加到扩展名而不只是使其成为 .h 文件?

我在 Google 上找不到有关此文件扩展名的任何信息,因为他们删除了搜索查询中的特殊字符,因此我得到了有关 .ch 文件的信息。

Sha*_*ger 5

它没有普遍适用的含义,但通常,它用于暗示它实际上是一个实现文件,由于构建系统的需要,它被#include添加到另一个文件中。

普通头文件提供原型和声明,并且通常仅提供所声明的内容的实现inlinestatic(甚至static是不受欢迎的,除非使用链接时优化来删除其编译版本的重复项)。提供其他类型的实现存在在多个编译的目标文件中重复定义相同可见实体的风险,从而导致链接时出现重复问题。由于.c.h本例中的文件旨在精确地#include包含在一个文件中(例如,仅旨在包含在父目录中),因此ing 它没有问题,因为它不会创建重复的定义。longobject.c.hlongobject.c#include

CPython 专门使用它们的原因是Argument Clinic。这是一个工具,可以让他们为内置函数生成优化的参数解析代码,而无需:

  1. 在逐个函数的基础上手写最佳解析代码,或者
  2. 依赖通用的、“printf类似”的解析 API,虽然方便,但效率较低

作为额外的好处,当他们改进解析框架和选项时(例如,当他们添加向量调用作为实现方法/函数的选项时),Argument Clinic 可以在一个地方进行更新,并且好处会立即在整个代码库中产生。

由于 Argument Clinic 在每次运行时都会从头开始重新生成文件,因此它们无法轻松地合并到手写的“实际工作”实现函数中,而不产生大量代码搅动并给提交补丁的人带来问题,因此他们将生成的代码到.c.h文件中以避免类似的冲突。