C头中的全局数组?

时间:2010-08-24 20:03:34

标签: c arrays visual-c++ global-variables

好的,奇怪的提问时间!

我正在重构一些旧的C ++代码,这些代码声明了一堆数组:

static SomeStruct SomeStructArray[] = {
    {1, 2, 3},
    {4, 5, 6},
    {NULL, 0, 0}
}

等等。它们分散在源文件中,并在声明它们的地方使用。

但是,我想将它们移动到一个源文件中(主要是因为我想出了一种自动生成它们的方法)。当然,我天真地试图为他们制作标题:

static SomeStruct SomeStructArray[];

实际上,即使我知道这是错的,但无论如何这里都是编译器错误:

error C2133: 'SomeStructArray' : unknown size    arrays.h
error C2086: 'SomeStruct SomeStructArray[]' : redefinition    arrays.cpp

所以,我想,这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:8)

如果您要将数组本身全部放在一个文件中(并且显然可以从其他文件访问它们),您需要从定义中删除 static(这使得它们成为可能)仅在同一翻译单元(即文件)内可见。)

然后,在标题中,您需要为每个声明添加extern

最后,当然,你需要确保当你有一个SomeStruct数组时(例如),在你尝试定义一个数组之前,SomeStruct的定义是可见的。它们。

答案 1 :(得分:0)

尝试使用

.h文件:

extern SomeStruct SomeStructArray[];

.cpp文件:

extern SomeStruct SomeStructArray[] = {
  {1, 2, 3},
  {4, 5, 6},
  {NULL, 0, 0}
}

答案 2 :(得分:0)

创建一个头文件并将其放入其中:

extern SomeStruct SomeStructArray[];

然后将现有代码放入源文件(不是头文件):

SomeStruct SomeStructArray[] = {
    {1, 2, 3},
    {4, 5, 6},
    {NULL, 0, 0}
}

缺点是,你无法在其他源文件中获得数组的大小:

size_t size = sizeof SomeStructArray; // doesn't work in any source file apart
                                      // from the one defining the array.

你可以添加额外的变量来解决这个问题。

这是使用DevStudio2k5测试的。