5

这包括三个相互关联的问题:

1) 你到底是如何得到多个翻译单元的?当然,所有源文件和头文件都会“加入”在一起,否则您最终会得到不属于该“程序”一部分的代码调用代码。翻译单元和程序不一样吗?

2) 静态对象/类如何处理多个翻译单元?如果不同翻译单元中的多个源文件包含一个会创建一个对象(具有静态数据成员)的标题,每个翻译单元是否会有一个单独的静态数据成员?

3) 与问题 2 类似,全局变量是否在多个翻译单元之间共享(有点像我暗示它们是单独的程序——只是一起编译???)还是全局变量仍然起作用……在所有翻译单元中都是全局的?

4

2 回答 2

8

1)每个源文件,连同它包含的头文件,被称为一个翻译单元。它被编译成一个目标文件。然后链接器最终将所有目标文件连接到最终的可执行文件中。(简化,但给你一个基本的想法)

2)链接器将消除副本。

3) 是的,见 2)

于 2013-03-06T22:15:03.960 回答
3
  1. 不,它们每个都被编译成一个目标文件,这些文件随后被链接在一起。

  2. 如果对象已声明但未在标头中定义,这是更好的做法,那么将只定义一个对象(假设它实际上定义在一个源文件中)并且包含标头的每个人都将有一种方法用它编程。

    static源文件中原本处于全局范围内的对象将无法在该翻译单元之外访问。在任何类或函数之外,static将范围限制为翻译单元。

  3. 非静态范围的对象,是的,它们确实如此。

于 2013-03-06T22:15:38.833 回答