2

假设我有一个Car.h定义了一个名为 Car 的类,并且我有实现 Car.cpp 来实现 my class Car,例如 myCar.cpp可以是:

struct Helper { ... };
Helper helpers[] = { /* init code */  };
Car::Car() {}
char *Car::GetName() { .....}

助手数组的生命周期是多少?我需要说static Helper helpers[];吗?如果我做了一些不好的做法,请告诉我。

4

2 回答 2

3

在全局/命名空间范围内声明/定义的任何变量都有完整的生命周期,直到代码结束。

如果您希望您Helper helpers[];只能在其中访问,Car.cpp那么只有您应该将其声明为static; 否则让它成为一个全球性的。换句话说,

Helper helpers[];        // accessible everywhere if `extern`ed to the file
static Helper helpers[];  // accessible only in `Car.cpp`

编辑:正如@a​​ndrewdski 在下面的评论中建议的那样;您应该将helpers[]其设为static变量,因为您在此文件中使用它;即使Helper在外面看不到。在 C++ 中,如果 2 个完全不同的单元具有相同的命名全局变量,那么编译器会通过将它们引用到相同的内存位置来默默地制造混乱。

于 2011-07-15T03:11:22.317 回答
2

在文件范围内定义的对象称为Static Storage Duration对象。

在大多数情况下,您可以将它们视为在 main() 进入之前创建并在 main() 退出之后销毁(有例外,但我不会担心)。

  • 静态存储持续时间变量的销毁顺序是创建的相反顺序。

  • 在同一编译单元(文件)中的创建顺序是它们被声明的顺序。

    • Note: There is no guarantee about the order of creation of Static Storage Duration objects across different compilation units.
于 2011-07-15T03:28:08.410 回答