在c+中重新声明数组+; 我试图将一些C代码移植到C++中,并且一个数组声明(或者说,一系列数组声明)给了我一些问题。代码的组织方式如下:首先,声明一个全局数组,如下所示: static const Foo foos[100]; static const Bar bar1[3] = { .... &foos[3]; .... }

在c+中重新声明数组+; 我试图将一些C代码移植到C++中,并且一个数组声明(或者说,一系列数组声明)给了我一些问题。代码的组织方式如下:首先,声明一个全局数组,如下所示: static const Foo foos[100]; static const Bar bar1[3] = { .... &foos[3]; .... },c++,arrays,initialization,C++,Arrays,Initialization,然后,声明并初始化一组其他数组,所有数组都引用foos数组的某些元素,如下所示: static const Foo foos[100]; static const Bar bar1[3] = { .... &foos[3]; .... } 最后,重新声明并初始化原始数组。数组的元素引用了我们刚刚声明的一组数组(换句话说,这些结构是相互递归的): 在C语言中,这很好用。第一个声明只是说“嘿,我以后需要一个100个Foo的数组”,然后第二个声明实际上告诉编译器我们要用什么数据填充数组。因

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

static const Foo foos[100];
static const Bar bar1[3] = { .... &foos[3]; .... }
最后,重新声明并初始化原始数组。数组的元素引用了我们刚刚声明的一组数组(换句话说,这些结构是相互递归的):

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

<强>但是,C++给我重新声明的实际问题。我不是真正的C++程序员,但我相信这一切都与C++默认规则初始化有关。 因此,我的问题是:如何在C++中捕获上述模型?如何在不初始化内容的情况下预先声明数组的类型和大小


(不要费心告诉我这是一个坏的设计——我实际上是在设计一个以C为目标的编译器,所以计算机生成的C代码的设计是好还是坏,这是不相关的。我只想知道如何预先声明C++中的结构数组)

< p>它在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
修饰符表示“将此变量的可见性限制为当前转换单位”。

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

extern const Foo foos[];

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

你确信把C代码移植到C++是值得的吗?C++是设计与C兼容的!不能重新定义已定义的内容。在我看来,您想要的是初始化
foos
,而不是“重新声明”它。这似乎是一个非常糟糕的设计。我建议重新设计它,而不是尝试以某种方式“移植”它。@Borgeader实际上我正在开发一个C代码生成器,我正在尝试使生成的代码与C++兼容。设计是计算机生成的,不应该是“好的”。