gpt4 book ai didi

c++ - 本地静态对象如何控制 C++ 中的编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:36 24 4
gpt4 key购买 nike

我一直在学习 Effective C++,并且在 Meyer 的其中一项指导方针中提到,如果我们在一个翻译单元中声明一个非本地静态对象及其在另一个翻译单元中定义它会导致未定义的行为。通过编写一个返回对本地静态对象的引用的函数来解决此问题。

我的问题是:

本地静态对象如何控制各种翻译单元的编译?

编译器如何知道首先执行哪个翻译单元?

如果以有点不正确的方式问这个问题,我深表歉意。我希望你明白我的意思。

最佳答案

How do local static objects govern compilation of various translation units?

这是关于存储期限和隐私的。

静态对象需要在程序执行期间持续存在。它们通常位于与堆栈或堆不同的内存区域。其他翻译单元可能有静态对象。通过让编译器标记这些项目,链接器可以将它们全部放入同一内存区域。

静态对象需要隐私。当其他翻译单元使用变量标识符(其他模块中的静态对象)时,它们不能,因为变量是私有(private)的。这可能会产生错误,或者编译器可能会决定在其他翻译单元中生成一个拷贝。

如果您想要一个翻译单元内的“全局”变量,但其他翻译单元看不到它,请将其声明为静态变量。

How does the compiler know which translation unit to execute first?

不执行翻译单元。函数被执行。函数按照程序逻辑指定的顺序执行,而不管它们位于何处。

根据 C++ 语言的定义main() 函数首先执行,无论它位于何处、编译顺序或链接顺序如何。

注意:在 main 之前执行的还有其他函数,例如 C++ 环境设置和全局对象的构造函数。这是由编译器处理的,程序员通常看不到。

编辑 1:
关于类或结构的全局实例如何初始化以及何时初始化的讨论很多。

例如,全局类的构造函数可以调用cout 来打印一些东西。为了使其工作,需要在调用此构造函数之前初始化 I/O 流。所以现在 cout 对象需要在全局对象之前被初始化。

还有其他有趣的问题,但该讨论对于这个答案而言是广泛的。

关于c++ - 本地静态对象如何控制 C++ 中的编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com