单元测试-本地静态对象如何控制C++中的编译

unit testing - How do local static objects govern compilation in C++?

本文关键字:控制 C++ 编译 -本 静态 对象 何控制 单元测试      更新时间:2023-10-16

我一直在学习有效C++,在其中一条指南中,Meyer提到,如果我们在一个翻译单元中声明一个非本地静态对象定义在另一个翻译单元中,它会导致未定义的行为。这个问题可以通过编写一个函数来解决,该函数返回对本地静态对象的引用。

我的问题是:

本地静态对象如何管理各种翻译单元的编译

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

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

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

这关乎存储期限和隐私。

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

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

如果您想要一个翻译单元中的"全局"变量,但没有其他翻译单元看到它,请将其声明为静态变量。

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

不执行翻译单元。执行功能。函数按照程序逻辑指定的顺序执行,无论它们位于何处。

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

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

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

例如,全局类的构造函数可以调用cout来打印某些内容。为了实现这一点,在调用此构造函数之前,需要初始化I/O流。因此,现在cout对象需要在全局对象之前进行初始化。

还有其他有趣的问题,但对于这个答案,讨论的范围太广了。