Ric*_*art 2 c++ arrays initialization
我正在尝试将一些C代码移植到C++,而数组声明(或者更确切地说,一系列数组声明)给我带来了问题.代码的组织方式如下:首先,声明一个全局数组,如下所示:
static const Foo foos[100];
Run Code Online (Sandbox Code Playgroud)
然后,声明并初始化了一堆其他数组,所有这些数组都引用了foos数组的某些元素,如下所示:
static const Bar bar1[3] = { .... &foos[3]; .... }
Run Code Online (Sandbox Code Playgroud)
最后,重新声明并初始化原始数组.数组的元素引用了我们刚刚声明的一堆数组(换句话说,结构是相互递归的):
static const Foo foos[100] = { .... &bar1[1]; .... }
Run Code Online (Sandbox Code Playgroud)
在C中,这很好.第一个声明只是说"嘿,我以后需要一个100 Foo的数组",然后第二个声明实际上告诉编译器我们想用数据填充数据.因为我正在处理的结构是相互递归的,所以这一切都非常好.
但是,C++给了我重新声明的真正问题.我不是一个真正的C++程序员,但我相信这一切都与C++关于默认初始化的规则有关.
所以这是我的问题: 如何在C++中捕获上述模型?如何在不实际初始化内容的情况下预先声明数组的类型和大小?
(不要打扰告诉我这是一个糟糕的设计 - 我实际上是在编写一个针对C的编译器,所以计算机生成的C代码的设计是好还是坏都无关紧要.我只想知道如何在C++中预先声明结构数组.)
它在C中有效,因为C具有暂定的定义,而这些定义并未转移到C++中.例如,这是完全合法的C代码,但非法的C++代码:
int a;
int a;
int a;
Run Code Online (Sandbox Code Playgroud)
如果要在不定义数组的情况下声明数组(或任何其他变量),请使用extern:
extern const Foo foos[100]; // declaration
const Foo foos[100] = ...; // definition
Run Code Online (Sandbox Code Playgroud)
不能合并extern使用static,但你可以把东西变成一个匿名的命名空间,这或多或少有同样的效果.请注意,顶级变量始终是静态的; static全局变量上的修饰符表示"将此变量的可见性限制为当前转换单位".