C头中的全局数组?

C头中的全局数组?,c,arrays,visual-c++,global-variables,C,Arrays,Visual C++,Global Variables,好吧,奇怪的问题时间 我重构一些旧C++代码,声明一组数组,如:: static SomeStruct SomeStructArray[] = { {1, 2, 3}, {4, 5, 6}, {NULL, 0, 0} } 等等。它们分散在源文件中,并在声明它们的地方使用 但是,我希望将它们移动到单个源文件中(主要是因为我想出了一种自动生成它们的方法)。当然,我天真地尝试为他们制作一个标题: static SomeStruct SomeStructArray[]; 事实

好吧,奇怪的问题时间

我重构一些旧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

那么,我想,正确的方法是什么呢?

如果要将数组本身都放在一个文件中(并且显然要从其他文件中访问它们),则需要从定义中删除
静态
(这使得它们只在同一个翻译单元(即文件)中可见)

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

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

尝试使用

.h文件:

extern SomeStruct SomeStructArray[];
.cpp文件:

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

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

extern SomeStruct SomeStructArray[];
然后将现有代码放入源文件(而不是头文件):

缺点是,您无法在其他源文件中获取阵列的大小:

size_t size = sizeof SomeStructArray; // doesn't work in any source file apart
                                      // from the one defining the array.
您可以添加额外的变量来解决这个问题


这是使用DevStudio2k5测试的。

Ahhh。这是有道理的。还有,是的,我省略了代码中不相关的部分,因为它们是不相关的:)为什么数组本身上的
extern
?它不是从声明中得到了
extern
'd吗?这不是真的,我的编译器(即使在标准一致性模式下)说:错误:“SomeStructArray”声明为“extern”,后来声明为“static”,啊,我知道我做了什么。我没有将声明数组的头包含在包含数组定义的源文件中。修好了。
size_t size = sizeof SomeStructArray; // doesn't work in any source file apart
                                      // from the one defining the array.