.h文件的意义是什么?

我知道.h文件应该有:

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

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

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

我对么?

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

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

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

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

至于命名,我个人至少看到过这些 – *.h*.H*.hpp ), *.hpp*.hxx*.hh*.inl (对于普通标题,不仅仅是内联代码 – 哎呀)。 通常伴随着匹配的对象文件扩展名。

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

所以这都是品味和惯例的问题 – 你将#include包含哪些内容。

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

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

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

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

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

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

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

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

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

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