我一直在学习 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/