每次编译程序都要执行头文件吗?

Do Header files execute everytime when we compile the program?

当我们将 头文件 添加到我们的程序时,主要目的是我们必须使用它们的功能,并且要使用任何功能,编译器的工作是澄清它没有任何错误。那么当我们编译我们的程序时,编译器是否会执行包含的头文件中编写的所有函数?

将头文件视为关于如何使用各种数据结构和函数的蓝图和说明。没有这些声明,编译器就不知道如何正确组合函数调用,或者给定结构的内存布局是什么。

这些与实现是分开的,因为这些定义通常在需要使用它们的不同源文件之间共享。

它们不是机器指令意义上的“指令”,它们不执行任何代码。 C 不像在编译阶段执行实际代码的脚本语言。相反,编译器将代码转换为可执行文件,除非执行,否则实际上不会执行任何操作,它只是一个文件。

头文件是在设计和实现像 C 这样的语言时计算机的局限性的结果。 C 是在 1970 年代初期开发的,当时像 PDP-11 这样非常昂贵的机器总共有大约 4MB 的内存,并且通常由多个用户共享。

如今,像 Rust 和 Swift 这样的语言已经消除了对头文件的需求。他们只是解析源代码并根据需要提取声明。这是可能的,因为计算机的内存要大几千倍。

When we add the header files to our program, the main intent is that we have to use their functions and, to use any function it is compiler's job to clarify that it does not have any error.

当我们在源文件中 #include 一个 header 时,主要目的是 header 的内容被视为在那个时候直接出现在源文件。编译器对生成的聚合翻译单元负有与不 #include 任何内容的翻译单元相同的责任,包括识别和诊断对语言约束的违反。

C中header文件的常规用途是提供在别处定义的函数和变量的声明,以及提供可能有用的类型和宏的定义。 C header 文件通常不包含函数或变量定义(与声明相反),因为这很麻烦。

C++ header 文件的用途与 C header 文件相似,但它们通常还包含内联函数定义,尤其是 class 构造函数、析构函数和成员函数。

但是,除了第一段之外,其他所有内容都是约定俗成的用法,而不是语言规则。事实证明,让 header 包含可重用声明(和内联函数定义)非常有用,这样我们就不必知道或键入所有函数和外部的所有必需声明 objects 我们想使用,但我们可以,原则上,在不改变整体代码含义的情况下,将需要的声明手动写入每个源文件。

So when we compile our program, does compiler executes all the functions that are written in the included header files?

不,为什么会这样?编译器将包含 headers 的源代码编译为可执行程序和库。这不涉及执行正在编译的程序中定义的任何内容,无论它是否在 header 中定义。当生成的程序之一是 运行.

时执行函数