如何初始化D中的全局结构数组?

时间:2009-08-24 21:44:14

标签: struct initialization d

为了帮助我用D问题填充SO(= p),我遇到了另一个问题;在全球范围内初始化一系列结构。观察:

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的勇敢居民!我猜测错误信息与真正的问题没什么关系,因为[0] 是一个标识符(但是dmd认为它是一个声明者,AFAICT看起来超过docs,它不是??

2 个答案:

答案 0 :(得分: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 :(得分: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),每个结构都会获得一个默认构造函数,按顺序获取每个args。见StructLiteral

但不利的一面是,这可能会先将数组初始化为默认值,然后逐个更改值。因此,如果您事先知道所有值,那么使用实际的初始化语法可能会更有效。