gpt4 book ai didi

c++ - 在 C++ 中重新声明数组

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:43 25 4
gpt4 key购买 nike

我正在尝试将一些 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++ 中预先声明结构数组。)

最佳答案

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

int a;
int a;
int a;

如果你想声明一个数组(或任何其他变量)而不定义它,使用extern:

extern const Foo foos[100];   // declaration

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

您不能将externstatic 结合使用,但您可以将内容放入匿名 namespace 中,这或多或少具有相同的效果。请注意,顶级变量始终是静态的;全局变量上的 static 修饰符表示“限制该变量对当前翻译单元的可见性”。

关于c++ - 在 C++ 中重新声明数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21180945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com