7

我知道 .h 文件应该有:

  • 类声明,
  • 函数原型,
  • 和外部变量(用于全局变量)

但是把它做成一个.h文件有什么意义吗?我尝试将我.h的文件重命名为.c文件,它仍然有效。

We can name our file to be anything, but we choose to name it as a .h file.

我对么?

4

8 回答 8

13

虽然确切的命名是一种约定,但对头文件和源文件的处理之间的区别不是——头文件不是编译成目标文件,而是包含在源文件中(共同形成翻译单元)。此外,它们可能包含在多个源文件中,以便多个源文件共享相同的定义。文件的语义可能相同,但编译器会根据它们的用法对它们进行不同的处理。

就命名而言,我个人至少见过这些 -- *.h, *.H(ugh), *.hpp, *.hxx, *.hh, *.inl(对于普通的标题,而不仅仅是内联代码 -- 呸)。通常伴随着匹配的目标文件扩展名。

请注意,标准库头文件没有扩展名——例如字符串。

所以这完全取决于品味和惯例——你想要什么#include,就会被包括在内。

于 2010-01-27T11:01:45.057 回答
11

使用 .h 来命名头文件只是一种约定。您还将看到(可能在类 Unix 平台上):

  • .hpp(Boost 库使用这些)
  • .hxx(看起来像带有倾斜 + 符号的 h++ - 可爱,是吧?)
  • .H(Unix 区分大小写,因此您可以将它们与 .h 文件区分开来)

就个人而言,我强烈建议坚持使用 .h。特别是,不要使用 .H,否则如果您需要移植到不区分大小写的文件系统,您将陷入痛苦的境地。

于 2010-01-27T11:01:32.683 回答
5

这只是一个约定——“h”代表“标题”。不过,像大多数约定一样,您需要有充分的理由来违反它。

于 2010-01-27T10:59:30.707 回答
1

文件名及其扩展名对编译器毫无意义。您可以命名它们h.main或其他任何名称。只要记住保持包含完整。

于 2010-01-27T11:01:04.027 回答
1

我认为为类似 Visual Studio 的 IDE 扩展先前的答案可能是值得的。

为简单起见,您应该使用编程 IDE 识别的命名约定。它拥有的最重要的规则是告诉它为哪些文件使用什么编译器的规则。例如,.c 将编译为 C 代码,.cpp 将编译为 C++,.cs 将编译为 C#,.rc 将由资源编译器编译等等。

命名 .h 或标准编译器选择规则之一未涵盖的任何其他内容可防止文件自行编译,而这正是您想要的头文件。如果您已尝试在 Visual Studio 中将标头重命名为 .c 进行测试,除非您明确将其从构建中排除,否则它会为您编译。

您的 IDE 中可能还有其他可用的工具 - 例如,用于生成类图、进行源代码分析等的工具,并且这些工具也可能具有您应该保持兼容的文件命名约定。

于 2010-01-27T12:06:07.280 回答
0

您编译并将您的 .h 和 .cpp 链接到 .obj。然后将 .h 和 .obj(您的部分)提供给您的合作伙伴(您的合作伙伴对实际代码一无所知),最后链接器将所有 obj 合并为可执行文件。.h 是一个众所周知的指示符,它告诉程序员这个文件不包含定义。如果全世界都接受它,我们可以使用 .xyz :-)

于 2010-01-27T11:02:27.347 回答
0

我们的大型开发项目#includecc 文件来自 cc 文件,用于具有数百种方法的类。我不同意,但这是有原因的。

于 2010-01-27T11:11:31.330 回答
0

此外,当您有一个 makefile 时,可以这样说,将所有以 .c 结尾的文件编译为目标文件,而不是单独指定每个文件。现在,如果你开始用 .c 扩展名命名你的头文件,那么 make 系统可能会尝试将头文件编译成目标文件......

因此,拥有单独的 *.h 和 *.c 文件可以使所有内容保持清晰和清晰,不仅对程序员而言,而且对 make 系统、编译器和链接器也同样重要。

于 2010-01-27T11:38:55.150 回答