单元测试-本地静态对象如何控制C++中的编译
unit testing - How do local static objects govern compilation in C++?
我一直在学习有效C++,在其中一条指南中,Meyer提到,如果我们在一个翻译单元中声明一个非本地静态对象定义在另一个翻译单元中,它会导致未定义的行为。这个问题可以通过编写一个函数来解决,该函数返回对本地静态对象的引用。
我的问题是:
本地静态对象如何管理各种翻译单元的编译
编译器如何知道首先执行哪个翻译单元
如果被问到这个问题有点不正确,我深表歉意。我希望你明白我的意思。
本地静态对象如何管理各种翻译单元的编译?
这关乎存储期限和隐私。
静态对象需要在程序执行期间保持不变。它们通常被放置在与堆栈或堆不同的内存区域中。其他翻译单元可能具有静态对象。通过让编译器标记这些项,链接器可以将它们全部放入同一内存区域。
静态对象需要隐私。当其他翻译单元使用(其他模块中静态对象的(变量标识符时,它们不能,因为变量是私有的。这可能会产生错误,或者编译器可能决定在另一个翻译单元中生成副本。
如果您想要一个翻译单元中的"全局"变量,但没有其他翻译单元看到它,请将其声明为静态变量。
编译器如何知道首先执行哪个翻译单元?
不执行翻译单元。执行功能。函数按照程序逻辑指定的顺序执行,无论它们位于何处。
根据C++语言中的定义,main()
函数首先执行,而不管它位于何处、编译顺序或链接顺序如何。
注意:还有其他函数在main之前执行,例如C++环境设置和全局对象的构造函数。这是由编译器处理的,程序员通常看不到。
编辑1:
关于类或结构的全局实例是如何初始化的,以及何时初始化,有很多讨论。
例如,全局类的构造函数可以调用cout
来打印某些内容。为了实现这一点,在调用此构造函数之前,需要初始化I/O流。因此,现在cout
对象需要在全局对象之前进行初始化。
还有其他有趣的问题,但对于这个答案,讨论的范围太广了。
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 是否可以使用if constexpr删除控制流语句
- 无法在windows控制台中为C++程序提供必要的输入
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 查找 GCD:并非所有控制路径都返回值
- 通过 API 控制 DJI 相机
- 禁止在控制台上记录谷神星
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- Cython通过浮点数的最快方式,用于高频控制回路
- 用户控制从 c++ 到 java 脚本的 Webassembly 访问调用
- C ++,如何从控制台中输入的字符串中删除字母?
- 如何从单独的线程控制 SFML 窗口?
- 如何防止 Windows 控制台上的回车键自动滚动
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程