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

Struct 如何初始化D中的全局结构数组?,struct,initialization,d,Struct,Initialization,D,为了帮助我的一个人用D问题(=p)填充SO,我遇到了另一个问题;全局初始化结构数组。注意: 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 a

为了帮助我的一个人用D问题(=p)填充SO,我遇到了另一个问题;全局初始化结构数组。注意:

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]

通过查看的文档,我真的看不到任何对我来说完全明显的东西,所以我再次转向Stack Overflow的勇敢居民!我猜错误消息与真正的问题没有多大关系,因为[0]肯定是一个标识符(但是
dmd
认为它是一个声明器,而不是吗?

我不认为您可以像这样在每个元素的基础上初始化元素。这样行吗

A[2] as = [
    {0, 0.0f},
    {5, 5.2f}
];
考虑一下,如果在您的示例中,您不止一次将
提到[0]
,会发生什么情况:

as[0] = {0, 0.0f};
as[0] = {1, 1.0f};
程序初始化时,
作为[0]
的值是多少?这越来越像语句而不是初始值设定项

请注意,在D中,可以在特定索引处初始化数组元素,如下所示:

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

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

如果要逐个进行初始化,这也可以使用

struct A
{
    int a;
    float b;
}

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

void main() {}
如果没有显式定义构造函数(即静态opCall),则每个结构都会获得一个默认构造函数,按顺序使用每个参数。看


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

D'oh。我尝试了这个,但是忘记了我使用的是D,并且使用了C风格的{{},{}语法。谢谢。+1,D希望在模块的顶层有声明,而不是语句。对于无法在编译时计算的初始值,还可以使用模块initialiser.void initialisers(a[2]as=void;)确保未初始化内存。所以这是伟大的;谢谢