如果我在模块级别定义结构,我可以引用尚未定义的结构。
struct S {
ComesLater c;
}
struct ComesLater {}
但是如果我在unittest
或功能块中执行相同的操作,则它不起作用:
unittest {
struct S {
ComesLater c;
}
struct ComesLater {}
}
Error: undefined identifier 'ComesLater'
为什么?如何在函数内部获得与顺序无关的声明? d中是否有某种前瞻性声明?我需要这个,因为我使用mixin生成结构,并按照内部依赖性的顺序排序声明,如果有循环引用结构,那将是相当大的努力,有时是不可能的。 (使用指针。)
答案 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
等内容。