【问题标题】:How do I initialise a global array of structs in D?如何在 D 中初始化全局结构数组?
【发布时间】:2010-11-22 10:26:52
【问题描述】:

为了帮助我用 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] is 肯定是一个标识符(但dmd 认为它是一个声明符,AFAICT 查看docs,不是)?

【问题讨论】:

    标签: struct initialization d


    【解决方案1】:

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

    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 参考文档中的Arrays

    【讨论】:

    • 哦。我试过这个,但忘记了我使用的是 D 并使用了 C 风格的 {{},{}} 语法。谢谢。
    • +1,D 需要声明,而不是声明,位于模块的顶层。对于无法在编译时计算的初始值,您还可以使用模块初始化器。
    【解决方案2】:

    如果您想进行一对一的初始化,这也可以工作

    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 初始化器 (A[2] as = void;) 确保内存未初始化。所以这很棒;谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2015-07-30
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    相关资源
    最近更新 更多