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

Posted

技术标签:

【中文标题】静态、全局和多个翻译单元【英文标题】:Static, global and multiple translation units 【发布时间】:2013-03-06 22:11:37 【问题描述】:

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

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

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

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

【问题讨论】:

en.wikipedia.org/wiki/Linker_(computing) 可以帮到你。 【参考方案1】:

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

2) 链接器将消除副本。

3) 是的,见 2)

【讨论】:

【参考方案2】:

    不,它们每个都被编译成一个目标文件,这些文件随后被链接在一起。

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

    static 源文件中的对象,否则将在什么 似乎是全局范围,除此之外将无法访问 翻译单元。在任何类或函数之外,static 限制 范围到翻译单元。

    非静态范围的对象,是的。

【讨论】:

关于数字1,如果答案是“否”,那么在混合内联代码和静态代码时需要考虑“翻译单元”的目的是什么?

以上是关于静态、全局和多个翻译单元的主要内容,如果未能解决你的问题,请参考以下文章

在另一个翻译单元的静态破坏阶段引用时,“魔术静态”单例崩溃

第五章: 延迟计算 下静态时序分析圣经翻译计划

C ++为将(静态)const全局变量设置为另一个静态const变量而给出编译器错误

静态时序分析圣经翻译计划10——第五章:延迟计算 (下)

第五章: 延迟计算 上静态时序分析圣经翻译计划

static关键字总结