结构声明顺序

时间:2015-12-21 14:49:40

标签: struct d declaration forward-declaration

如果我在模块级别定义结构,我可以引用尚未定义的结构。

struct S {
  ComesLater c;
}
struct ComesLater {}

但是如果我在unittest或功能块中执行相同的操作,则它不起作用:

unittest {
  struct S {
    ComesLater c;
  }
  struct ComesLater {}
}

Error: undefined identifier 'ComesLater'

为什么?如何在函数内部获得与顺序无关的声明? d中是否有某种前瞻性声明?我需要这个,因为我使用mixin生成结构,并按照内部依赖性的顺序排序声明,如果有循环引用结构,那将是相当大的努力,有时是不可能的。 (使用指针。)

1 个答案:

答案 0 :(得分:2)

函数,单元测试或其他任何语句可以实际执行的声明确实依赖于顺序,因为它们的值可能取决于运行之前的代码。想想一个局部变量:

int a;
writeln(a);
a = b;
int b = get_user_line();

如果订单在那里不重要,两个函数什么时候会被调用?当声明被重写时,是否会要求用户在writeln之前输入一行?

使b成为未定义变量错误的当前行为使其简单明了。

它在其他上下文中独立于顺序工作,因为它没有可依赖的可执行代码,因此如果编译器需要以不同的方式在内部对其进行思考,则不会有任何行为发生变化。

所以:

  

如何在函数内部获得与顺序无关的声明?

更改上下文,使得没有可执行代码...将其全部放在另一个结构中!

void main() { // or unittest { }
        struct Holder {
                static struct S {
                        C c;
                }
                static struct C {}
        }
}

由于执行发生在持有者身边并且不会发生在其中,因此内部声明的顺序无关紧要。由于您可以在结构中定义几乎任何内容,因此可以将其用于变量,函数,其他结构等。基本上,您只需将现有代码包装在struct Holder {}括号内。

通过将所有内容设置为静态,您可以像容器一样使用它,并在外部引用Holder.S等内容。