【问题标题】:Do Header files execute everytime when we compile the program? [closed]每次编译程序时,头文件都会执行吗? [关闭]
【发布时间】:2020-08-12 21:41:57
【问题描述】:

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

【问题讨论】:

  • 您能否分享一下您所说的“编译器是否执行所有功能”?
  • 也不要标记多个编程语言标签。
  • 头文件一般不包含“指令”,它们包含很多和丢失的声明
  • 编译器不执行他们编译的代码,他们编译它。一些编译器确实提供了precompiled headers 的功能。
  • 标记这个 C 和 C++ 会引起很多问题。 C++ 可能与 C 有很多功能重叠,但它是一种不同的语言,适用的规则完全不同。此外,未来 C++ 将有模块,而 C 可能不会。

标签: linker compiler-construction execution preprocessor


【解决方案1】:

当我们将头文件添加到我们的程序中时,主要意图是 我们必须使用它们的功能,并且要使用它的任何功能 编译器的工作是澄清它没有任何错误。

当我们#include 源文件中的标头时,主要意图是标头的内容被视为直接出现在源文件中。编译器对生成的聚合翻译单元的责任与对不#include 任何事情的翻译单元的责任相同,包括识别和诊断违反语言约束的情况。

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

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

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

所以当我们 编译我们的程序,编译器会执行所有的函数吗? 写在包含的头文件里?

不,为什么会这样?编译器将包含头文件的源代码编译为可执行程序和库。这不涉及执行正在编译的程序中定义的任何内容,无论它是否在标头中定义。运行其中一个结果程序时执行函数。

【讨论】:

    【解决方案2】:

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

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

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

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

    如今,Rust 和 Swift 等语言已经不再需要头文件。他们只是解析源代码并根据需要提取声明。这只是可能的,因为计算机有几千倍的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多