在c ++中重新声明数组

时间:2014-01-17 08:15:42

标签: c++ arrays initialization

我正在尝试将一些C代码移植到C ++,而数组声明(或者更确切地说,一系列数组声明)给我带来了问题。代码的组织方式如下:首先,声明一个全局数组,如下所示:

static const Foo foos[100];

然后,声明并初始化了一堆其他数组,所有这些数组都引用了foos数组的某些元素,如下所示:

static const Bar bar1[3] = { .... &foos[3]; .... }

最后,重新声明并初始化原始数组。数组的元素引用了我们刚刚声明的一堆数组(换句话说,结构是相互递归的):

static const Foo foos[100] = { .... &bar1[1]; .... }

在C中,这很好用。第一个声明只是说“嘿,我以后需要一个100 Foo的数组”,然后第二个声明实际上告诉编译器我们想用数据填充数据。因为我正在处理的结构是相互递归的,所以这一切都非常好。

然而,C ++给了我重新声明的真正问题。我不是一个真正的C ++程序员,但我相信这一切都与C ++关于默认初始化的规则有关。

所以这是我的问题:如何在C ++中捕获上述模型?如何在不实际初始化内容的情况下预先声明数组的类型和大小?

(不要打扰告诉我这是一个糟糕的设计 - 我实际上正在开发一个针对C的编译器,因此计算机生成的C代码的设计是好还是坏都无关紧要。我只是想知道如何在C ++中预先声明结构数组。)

2 个答案:

答案 0 :(得分:5)

它在C中有效,因为C具有暂定定义,它们没有被转移到C ++。例如,这是完全合法的C代码,但非法的C ++代码:

int a;
int a;
int a;

如果要在不定义数组的情况下声明数组(或任何其他变量),请使用extern

extern const Foo foos[100];   // declaration

const Foo foos[100] = ...;    // definition

您无法将externstatic结合使用,但您可以将内容放入匿名命名空间,该命名空间或多或少具有相同的效果。请注意,顶级变量始终是静态的;全局变量上的static修饰符表示“将此变量的可见性限制为当前转换单位”。

答案 1 :(得分:0)

不要将其设置为静态,而是将Foo的声明更改为extern。

extern const Foo foos[];

static const Bar bar[] = { ..., &foos[13], ... };
const Foo foos[] = { ..., &bar[1], ... };