静态、全局和多个翻译单元

6

这包括三个相关的问题:

1)如何才能得到多个翻译单元?所有源文件和头文件不都应该“连接”在一起吗?否则,你最终会得到一个调用不属于该“程序”的代码的代码。难道一个翻译单元就是一个程序吗?

2)静态对象/类如何处理多个翻译单元?如果几个属于不同翻译单元的源文件包含一个将创建对象(具有静态数据成员)的头文件,那么每个翻译单元是否有一个单独的静态数据成员?

3)与问题2类似,全局变量是否跨多个翻译单元共享(有点像我提出它们是单独的程序-只是编译在一起吗?),还是全局变量仍然在所有翻译单元中作为全局变量运行?


https://en.wikipedia.org/wiki/Linker_(computing) 可能会对你有所帮助。 - Davide R.
2个回答

9

1) 每个源文件和它的包含头文件一起被称为翻译单元。它会被编译成一个目标文件。链接器最终将所有目标文件合并成最终的可执行文件。(简化但给你一个基本的概念)

2) 链接器将消除副本。

3) 是的,见2)。


4
  1. 不是,它们各自被编译成一个对象文件,然后再链接在一起。

  2. 如果对象在头文件中声明但未定义,则最好的做法是只定义一次对象 (假定确实在一个源文件中定义)。这样每个包含该头文件的人都可以使用该对象进行编程。

    源文件中的static对象(本应处于全局作用域)将无法在翻译单元之外访问。在任何类或函数以外,static将作用域限制为翻译单元。

  3. 非静态作用域对象会有副作用,所以是的,它们会。


关于第一点,如果答案是“否”,那么在混合使用内联和静态代码时需要考虑“翻译单元”的目的是什么? - user997112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接