3

为了帮助我用 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]

翻阅Digital Mars的文档,我真的看不到任何对我来说完全明显的东西,所以我再次求助于 Stack Overflow 的勇敢居民!我猜错误消息与真正的问题没有太大关系,因为 [0] 肯定一个标识符(但dmd认为它是一个声明符,AFAICT 查看文档,它不是)?

4

2 回答 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]程序初始化时的值是多少?这变得更像是statements而不是initialisers

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

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

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

于 2009-08-24T21:52:41.410 回答
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),则每个结构都会获得一个默认构造函数,按顺序获取每个参数。见结构字面量

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

于 2009-08-24T22:38:24.440 回答