那么当我们编写一个 C 程序时,我们只需要一个 .C 文件,对吗? 我们可以将额外的 C 文件和 H 文件包含到我们的主 .C 文件中,但我不确定它们之间有什么区别。
为什么要创建多个 .C 文件? 他们不能创建一堆 .H 文件并将它们包含在主 .C 文件中吗?
如果我们将一大堆 .H 文件包含到主 .C 文件中,是否会增加构建时间? 如果是这样,那么您想要做的是为您为程序创建的每个“模块”创建一个 .C 文件和一个 .H 文件,然后只在需要的地方包含特定的 .H 文件?
我只是想了解大型项目如何处理它。
.c
和.h
文件之间的区别.c
文件(对于 C++ 也是 .cpp
):这些是实际代码实现所在的源文件。这是您定义函数、编写逻辑等的地方。
.h
文件(头文件):这些文件包含其他 .c
文件可能需要了解的函数、变量和其他构造(例如结构、常量)的声明。头文件通常不包含实际的实现(尽管有时会包含模板、宏或内联函数)。
.c
文件?模块化:将代码拆分为多个
.c
文件可以让您更好地组织它。每个 .c
文件处理特定的“模块”或一组相关功能。这提高了大型项目的可读性、可维护性和团队协作。
可重用性:程序的不同部分(甚至不同的项目)可以重用
.c
文件。例如,数学库可以保存在单独的 .c
文件中,您可以根据需要将其包含在各种程序中。
编译效率:每个
.c
文件都是单独编译的。这意味着如果您只更改一个文件,则只需重新编译该文件而不是整个项目。这减少了大型项目的构建时间。
.h
文件?Separation of Declarations and Definitions:
.h
文件旨在声明存在的内容,而 .c
文件旨在定义其工作方式。仅包含 .H 文件意味着您必须在其中放入实际的函数代码,这违背了将接口(函数做什么)与实现(函数如何做)分开的想法。
多重包含问题:如果将代码放在
.h
文件中并将它们包含在多个.c
文件中,编译器将尝试多次编译相同的代码,这将导致错误。这就是为什么您通常只在 .h
文件中声明事物并在 .c
文件中定义它们。
.h
文件会增加构建时间吗?是的,包含许多
.h
文件会减慢构建过程,因为编译器必须处理所有包含的文件。但是,如果 .h
文件仅包含声明(它们应该如此),则此开销通常很小。如果您要在 .h
文件中包含大量实际代码(定义),那么真正的打击就会到来。
典型的项目结构
在大多数 C 项目中,您会将代码构建为单独的
.c
和 .h
文件,如下所示:
对于每个模块,创建:
.c
文件。.h
文件,包含其他模块需要使用的函数和类型的声明。
然后,您可以在需要的地方包含 .h
文件。 .c
文件单独编译并链接在一起形成最终的可执行文件。math.h // Declarations for math functions (like add, subtract, etc.)
math.c // Definitions (actual code) for those math functions
main.c // The main program that uses the functions declared in math.h
在
main.c
中,您可以包含 math.h
来访问加法和减法函数声明,但实现仍保留在 math.c
中。