什么是C中的“私人标题”?

我最近一直在学习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; 

作者提到它是一个“私人标题”,但我希望他能更明确地知道究竟是什么。

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

只有类的实现才会引用.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.r严格地用于Circle类的实现而不是其他类,因此,使其成为“私有头”。

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

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

基本上,私有标头只是一个标题,它只是由特定的实现文件包含,而不是由消费者包含。 它与语言或编译器无关,它只是一种编码约定。

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

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

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

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

正如其他人所说, .r并不重要。 私有标题可能只是意味着除了使用它的文件之外,它不应被包含在内。

这段代码看起来像是在C中模仿C ++。它正在创建一个constClass ”对象,它包含“class” String的大小,构造函数,析构函数等。 此结构包含此OO库用于C的公共类信息。

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

  • module.h – 公共接口; 客户端代码所需的名称,结构和function。 如果可能,不要定义结构,只需声明它们的名称并在界面中使用不透明指针。 如果您要提供SDK,则这将是已发布的标头。
  • modulep.h – 私有标头; 模块中使用的声明和定义 – 客户端代码不需要(也不应该)包含这些。 如果您要提供SDK,则不会发布。
  • module.c – 实现; 这将使用module.h和modulep.h