在C语言中,“私有头文件”是什么?

15

我最近在学习C,在我的一本教材中找到了一个名为“.r”扩展名的文件的参考。现在,可以想象,谷歌“r”或“file extension 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
我只是好奇...你正在阅读哪本教科书? - Alceu Costa
1
我不太确定私有头是什么,或者这段代码在做什么,但是“.r”并不重要。文件扩展名只是建议。 - Zifre
一定要告诉我们这本书是什么。 - jmucchiello
我真的希望“r”是法语中“header”的第一个字母,但显然不是。=) - Can Berk Güder
不,它是“header”中的最后一个字母 :-) - Roboprog
2
哦,这本书是Axel-Tobias Scheiner的《面向对象编程,以ANSI-C为例》。这是我最喜欢的书之一! - Ziggy
6个回答

14

文件扩展名".r"实际上并没有什么特别的含义,可能只是作者使用的个人惯例。有些人会将他们的私有头文件命名为"new_p.h"或类似的名称。

基本上,私有头文件只是一个仅供特定实现文件包含,而不是用于消费者的头文件。它与语言或编译器无关,只是一种编码惯例。


1
如果是我,我可能会倾向于为foo.c使用一个头文件foo.h,并在其中使用#ifdef块来禁用其他文件不需要的内容(并且可能有一两个#ifndef用于变量前面的一些“extern”行?)。
也许作者使用了一种约定,即*.h是“发布”/“发布”的,但*.r则不是,以保护“知识产权”或类似的东西?
- Roboprog
"NewP.h" 也有一定的流行度,例如在 X11 中使用,而 "new_p.h" 则在 Qt 中使用。 - ninjalj

9
我遇到的一个.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.r严格用于实现Circle类而不是其他人,因此使其成为“私有标头”。 r文件扩展名基本上是一种惯例,不是“官方”的或经常使用的东西。 它用于方便起见,并与具有h文件扩展名的常规标头文件区分开来。

你掌握了这个参考!面向对象编程,以 ANSI-C 为基础!有蛋糕等着你,只要知道在哪里找。 - Ziggy

5

C语言编译器对文件扩展名没有特定的意义,因此使用.r扩展名只是作者按照惯例表示某些东西的方式。我不熟悉这本书,不知道可能是什么,但请放心,编译器并不会给文件名附加任何特定含义。


2
实际上,GCC使用文件扩展名来确定如何处理文件 - 它将.c文件提供给预处理器/编译器/链接器,将.cpp文件提供给C ++预处理器/C编译器/链接器,仅将.o文件提供给链接器等。当然,这可以通过命令行选项覆盖,并且.r不是已知的扩展名之一(据我所知),因此我并不是说你错了,但我认为值得提及这种行为。 - David Z
1
@David:对于在命令行上指定的文件是正确的,但对于通过预处理器#include包含的文件则不然。 - Greg Hewgill

3
据我所知,从各种开源项目中可以看出,私有标头是仅供特定代码(文件或多个文件)使用的标头。例如,当一些文件需要访问彼此的符号/声明,但这些符号/声明不应从其他代码访问时,它们非常有用。或者它们可以用于将原型拆分出.c文件。
全局或普通标头通常存储在特殊的“include”目录中,而私有标头则靠近它们服务的特定代码。
至于“点r”扩展名,我以前从未听说过。我见过的私有标头都被命名为“点h”,就像所有其他标头一样。

1

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

这段代码片段看起来像是在C语言中模拟C++。它创建了一个const "Class"对象,用于保存“类”String的大小、构造函数、析构函数等信息。这个结构体保存了通用的类信息,供这个C的OO库使用。


0

我通常看到的私有头文件惯用命名规则如下:

  • module.h - 公共接口;客户端代码需要的名称、结构和函数。如果可能,不要定义结构,只声明它们的名称并在接口中使用不透明指针。如果您提供一个SDK,这将是发布的头文件。
  • modulep.h - 私有头文件;模块内部使用的声明和定义 - 客户端代码不需要(也不应该)包含这些内容。如果您提供一个SDK,这将不会被发布。
  • module.c - 实现;这将同时使用module.h和modulep.h

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接