假设我有一个Car.h
来定义一个名为Car的类,我有实现Car.cpp来实现我的class Car
,例如我的Car.cpp
可以是:
struct Helper { ... };
Helper helpers[] = { /* init code */ };
Car::Car() {}
char *Car::GetName() { .....}
辅助阵列的生命周期是多少?
我需要说static Helper helpers[];
吗?
如果我做了一些不好的做法,请告诉我。
答案 0 :(得分:3)
在global / namespace范围内声明/定义的任何变量都有一个完整的生命周期,直到代码结束。
如果您希望Helper helpers[];
只能在Car.cpp
内访问,那么只有您应该将其声明为static
;否则让它成为全球性的。换句话说,
Helper helpers[]; // accessible everywhere if `extern`ed to the file
static Helper helpers[]; // accessible only in `Car.cpp`
修改:正如,@ andrewdski在下面的评论中提出的那样;您应该将helpers[]
设为static
变量,因为您在此文件中使用它;即使外面看不到Helper
。在C ++中,如果2个完全不同的单元具有相同的命名全局变量,则编译器静默通过将它们引用到相同的内存位置来创建混乱。
答案 1 :(得分:2)
在文件范围定义的对象称为Static Storage Duration
个对象。
在大多数情况下,您可以将它们视为在main()输入之前创建并在main()退出后销毁(有例外但我不担心)。
静态存储持续时间变量的破坏顺序与创建顺序相反。
同一编译单元(文件)中的创建顺序是它们的声明顺序。
Static Storage Duration
个对象的顺序。