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

标签 c++ unit-testing

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

相关文章:

c++ - 删除 C++-STL/Boost 调试符号(...或不创建它们)

c++ - _WIN32_WINNT 定义在 header 中更改,这是否会导致二进制不兼容?

c++ - OpenMP 指针

unit-testing - KafkaTestUtils.getRecords() 只返回第一个发送的记录

unit-testing - Espresso - withEffectiveVisibility 与 isDisplayed

unit-testing - Rails3 : Find method not working with fixtures in test environment

python - 带有测试套件和测试用例的 TestSuite

c++ - 如何在微 Controller 上运行 opencv?

c# - 如何使用 swig 从 `uint []` 返回 `unsigned int *`

java - 在单元测试中使用模拟实现修补 Java 类