.h文件的意义是什么?

时间:2010-01-27 10:56:04

标签: c++ c header-files

我知道.h文件应该有:

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

但将它作为.h文件有一些意义吗? 我尝试将我的.h文件重命名为.c文件,但仍然有效。

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

我是否正确?

8 个答案:

答案 0 :(得分:13)

虽然确切的命名是一种约定,但是头文件和源文件的处理之间的区别不是 - 头文件编译成目标文件,但包含在源文件中(共同形成)翻译单位)。此外,它们可能包含在多个源文件中,因此多个源文件共享相同的定义。文件的语义可能相同,但由于它们的使用,编译器对它们的处理方式不同。

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

请注意,标准库标题没有扩展程序 - 例如字符串。

所以这都是品味和惯例的问题 - 你将会*.inl包含哪些内容。

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:5)

这只是一个惯例 - “h”代表“标题”。但是,与大多数惯例一样,你需要有一个很好的理由来反对它。

答案 3 :(得分:1)

文件的名称及其扩展名对编译器来说绝对没有意义。您可以将它们命名为h.main或其他任何名称。只记得保持包含完整。

答案 4 :(得分:1)

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

为简单起见,您应该使用编程IDE可识别的命名约定。它最重要的规则就是告诉它使用什么编译器来处理哪些文件。例如,.c将被编译为C代码,.cpp将被编译为C ++,。cc将被编译为C#,.。c将由资源编译器编译,依此类推。

命名某些.h或其他任何标准编译器选择规则未涵盖的内容,可防止文件自行编译,这就是您对头文件所需的内容。如果您在Visual Studio中尝试过将标题重命名为.c的测试,那么除非您明确地将其从构建中排除,否则它将为您编译。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我们的大型开发项目#include来自cc文件的cc文件,用于具有数百种方法的类。我不同意,但有理由。

答案 7 :(得分:0)

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

因此,单独使用* .h和* .c文件可以使所有内容保持清晰,不仅对于程序员而且对于make系统,编译器和链接器来说都是至关重要的。