参考effective c++
腾讯面试题 全局变量初始化顺序
1. static对象
包括global对象、定义域namespace作用域内的对象、class内或者函数内或文件作用域内被声明为static的对象
局部static对象,函数内声明的static对象,其他的都是全局static对象
2. 编译单元
产生单一目标文件的源码,基本上是单一源码文件加上包含的头文件
编译后形成目标文件,连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。
.c 或.cpp + 包含的.h文件 编译=>> 目标文件
问题:
如果某个编译单元内的某个non-local static对象的初始化动作使用了另外一个编译单元中non-local static对象,它所使用的对象可能没有初始化,因为c++对定义在不同编译单元的non-local static对象的初始化次序无明确定义。
A.h
class A{
int key;
};
extern A a;
B.h
#include "A.h"

本文讨论了C++中非局部静态对象的初始化顺序问题,特别是涉及不同编译单元的情况。由于C++未明确规定跨编译单元的non-local static对象初始化顺序,可能导致不确定性。解决方案是将non-local static对象转换为local static对象,利用C++保证的函数内local static对象的初始化特性。此外,文章还介绍了全局变量与静态变量的区别,以及extern和static的用法和区别。
1671

被折叠的 条评论
为什么被折叠?



