我正在尝试将一些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 ++中预先声明结构数组。)
答案 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
您无法将extern
与static
结合使用,但您可以将内容放入匿名命名空间,该命名空间或多或少具有相同的效果。请注意,顶级变量始终是静态的;全局变量上的static
修饰符表示“将此变量的可见性限制为当前转换单位”。
答案 1 :(得分:0)
不要将其设置为静态,而是将Foo的声明更改为extern。
extern const Foo foos[];
static const Bar bar[] = { ..., &foos[13], ... };
const Foo foos[] = { ..., &bar[1], ... };