假设我有一个Car.h
,它定义了一个叫做Car的类,我有一个实现Car.cpp,它实现了我的class Car
,例如我的Car.cpp
可以是:
struct Helper { ... };
Helper helpers[] = { /* init code */ };
Car::Car() {}
char *Car::GetName() { .....}
helper数组的生命周期是多少?我需要说static Helper helpers[];
吗?如果我做了一些不好的做法,请告诉我。
在全局/命名空间范围内声明/定义的任何变量都有一个完整的生命周期,直到代码结束。
如果你希望你的Helper helpers[];
只能在Car.cpp
内访问,那么你只应该将它声明为static
;否则就让它成为一个全局变量。换句话说,
Helper helpers[]; // accessible everywhere if `extern`ed to the file
static Helper helpers[]; // accessible only in `Car.cpp`
Edit: As, @andrewdski在下面的评论中建议;你应该把helpers[]
作为static
变量,因为你在这个文件中使用它;即使Helper
在外面不可见。在c++中,如果两个完全不同的单元具有相同的命名全局变量,那么编译器会通过将它们引用到相同的内存位置而静默地创建一个混乱
在文件作用域中定义的对象称为Static Storage Duration
对象。
在大多数情况下,你可以认为它们是在main()进入之前创建的,并在main()退出后销毁(有例外,但我不担心)。
-
静态存储时间变量的销毁顺序与创建顺序相反。
-
在同一个编译单元(文件)内的创建顺序是它们被声明的顺序。
- 注意:不能保证
Static Storage Duration
对象在不同编译单元上的创建顺序。