为了帮助我用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,它不是??
答案 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
但不利的一面是,这可能会先将数组初始化为默认值,然后逐个更改值。因此,如果您事先知道所有值,那么使用实际的初始化语法可能会更有效。