12

我最近一直在学习C,在我的一本教科书中,我找到了对带有“.r”扩展名的文件的引用。现在,您可以想象,谷歌搜索“r”或“文件扩展名 r”并不高效,所以我想知道您是否可以帮助我。

它出现在以下代码块中

#include "new.r"

static const struct Class _String = {
  sizeof(struct String),
  String_ctor, String_dtor,
  String_clone, String_differ
};

const void * String = & _String;

作者提到它是一个“私有标题”,但我希望他能更清楚地知道它到底是什么。

4

6 回答 6

12

文件扩展名“.r”实际上并没有多大意义,可能只是该作者使用的个人约定。有些人会将他们的私有标题命名为“new_p.h”或类似的名称。

基本上,私有标头只是一个标头,仅应包含在该特定实现文件中,而不是由使用者包含。它与语言或编译器无关,它只是一个编码约定。

于 2009-06-06T00:41:43.040 回答
8

我遇到.r文件的实例是在使用 ANSI-C 的面向对象编程中,其中.r文件被用作类的“表示”——(如果我理解正确的话)一种通过保存来执行信息隐藏的方法内部表示并控制对单独头文件中类的功能的访问。

只有类的实现才会引用.r文件,在这方面它可以被视为类的“私有头”。类外部的接口,使用了一个常规的.h头文件。

例如,一个类可能由三个文件组成:

Circle.h    /* Header file with external interfaces, such as methods. */

Circle.r    /* Representation file for internal use within the class, such as
               structs that define the internal states. */

Circle.c    /* Implementation of the Circle class. */

然后,按照惯例,利用Circle该类的程序可以包括该Circle.h文件作为访问该类的接口。Circle.rCircle类的实现而不是其他人严格使用,因此,使其成为“私有标头”。

文件扩展名基本上是一个使用的r约定,而不是“官方”或一直使用的东西。它用于方便起见并与带有h文件扩展名的常规头文件区分开来。

于 2009-06-06T02:36:43.823 回答
5

C 编译器不会对文件扩展名附加任何特殊含义,因此扩展名的使用.r只是作者按惯例指示某些内容的方式。不熟悉这本书,我不知道那可能是什么,但请放心,编译器没有为文件名附加任何特殊含义。

于 2009-06-06T00:39:13.060 回答
3

据我从我见过的各种开源项目中可以看出,私有标头是旨在仅由特定代码段(一个文件或多个文件)使用的标头。例如,当某些文件需要访问彼此的符号/声明,但不应从其他代码访问这些符号/声明时,它们很有用。或者它们可用于将原型从 .c 文件中拆分出来。

全局或普通标头通常存储在一个特殊的“包含”目录中,而私有标头位于它们所服务的特定代码附近。

至于“dot r”扩展名,我以前从未听说过。我见过的私有标题被命名为“dot h”,就像所有其他标题一样。

于 2009-06-06T00:46:25.167 回答
0

正如其他人所说,.r并不重要。私有标头可能只是意味着它不应该被任何东西包含,除了使用它的文件。

这段代码看起来有点像在 C 中模拟 C++。它正在创建一个const" Class" 对象,其中包含 "class" 的大小、构造函数、析构函数等String。这个结构保存了这个面向 C 的 OO 库要使用的公共类信息。

于 2009-06-06T00:47:59.627 回答
0

我通常看到的私有标头的习惯用法是使用以下命名约定:

  • module.h - 公共接口;客户端代码需要的名称、结构和功能。如果可能,不要定义结构,只需声明它们的名称并在接口中使用不透明的指针。如果您提供 SDK,这将是已发布的标头。
  • modulep.h - 私有头文件;模块中使用的声明和定义 - 客户端代码不需要(也不应该)包含这些。如果您提供 SDK,则不会发布。
  • module.c - 实现;这将同时使用 module.h 和 modulep.h
于 2009-06-06T03:41:23.270 回答