如何在D语言中初始化一个全局结构体数组?

3

为了让SO(即Stack Overflow)上有更多关于D语言的问题,我正在进行一项个人任务。然而,我又遇到了一个问题:如何在全局范围内初始化一个结构体数组。请看下面的代码:

struct A
{
    int a;
    float b;
}

A[2] as;
as[0] = {0, 0.0f};
as[1] = {5, 5.2f};

void main() {}

结果为:

$ dmd wtf.d 
wtf.d(8): no identifier for declarator as[0]
wtf.d(9): no identifier for declarator as[1]

浏览Digital Mars的文档,我并没有看到任何对我来说完全明显的内容,所以我再次向勇敢的Stack Overflow社区求助! 我猜测错误信息与真正的问题无关,因为毫无疑问一个标识符(但是dmd认为它是一个声明符号,根据我查看文档得出结论,它不是)。
2个回答

6

我认为你不能以这种方式逐个初始化元素。这样行吗?

A[2] as = [
    {0, 0.0f},
    {5, 5.2f}
];

考虑以下情况,如果在你的示例中多次提到 as[0] 会发生什么:
as[0] = {0, 0.0f};
as[0] = {1, 1.0f};

在程序初始化时,as[0]的值是什么?这更像是语句而不是初始化器
请注意,在D语言中,您可以像这样初始化特定索引处的数组元素:
A[2] as = [
    0: {0, 0.0f},
    1: {5, 5.2f}
];

如果您有一个较大的数组(例如A[10]),并且只需要初始化其中一些元素,那么这将非常有用。有关更多信息,请参见D参考文档中的Arrays


1
哎呀,我尝试过这个,但是忘记我正在使用 D 语言,而不是 C 风格的 {{},{}} 语法。谢谢。 - Bernard
+1,D语言要求在模块的顶层只能有声明而不能有语句。对于那些无法在编译时计算的初始值,您也可以使用模块初始化器。 - anton.burger

3
这也适用于单个初始化的情况。
struct A
{
    int a;
    float b;
}

A[2] as;
as[0] = A(0, 0.0f);
as[1] = A(5, 5.2f);

void main() {}

如果您没有明确定义构造函数(即静态opCall),则每个结构体都会获得一个默认构造函数,按顺序使用每个参数。请参见StructLiteral
但是缺点是这可能会先将数组初始化为默认值,然后逐个更改值。因此,如果您预先知道所有值,则使用实际的初始化语法可能更有效率。

void initialisers (A[2] as = void;) 确保内存不被初始化。所以这很好,谢谢。 - Bernard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接