结构声明顺序
Struct declaration order
如果我在模块级别定义结构,我可以引用尚未定义的结构。
struct S {
ComesLater c;
}
struct ComesLater {}
但是如果我在 unittest
或功能块中执行相同的操作,它就不起作用:
unittest {
struct S {
ComesLater c;
}
struct ComesLater {}
}
Error: undefined identifier 'ComesLater'
这是为什么?如何在函数内获得与顺序无关的声明? d中是否有某种前向声明?我需要这个,因为我使用 mixin 生成结构,并且如果存在循环引用结构,则按照其内部依赖关系的顺序对声明进行排序将是相当大的努力,有时甚至是不可能的。 (使用指针。)
函数、单元测试或任何其他可以实际执行语句的地方的声明确实是依赖于顺序的,因为它们的值可能取决于它们之前的代码运行。想一个局部变量:
int a;
writeln(a);
a = b;
int b = get_user_line();
如果那里的顺序不重要,那么什么时候调用这两个函数?当声明被重写时,是否会要求用户在 writeln 之前输入一行?
使 b 成为未定义变量错误的当前行为使其简单明了。
它的工作独立于其他上下文中的顺序,因为没有它可以依赖的可执行代码,所以如果编译器需要在内部以不同方式考虑它,则没有可以更改的行为。
所以:
How can I get order-independent declarations inside functions?
更改上下文,使没有可执行代码...将其全部放在另一个结构中!
void main() { // or unittest { }
struct Holder {
static struct S {
C c;
}
static struct C {}
}
}
由于执行发生在 holder 周围,而不发生在 holder 内部,因此内部声明的顺序不再重要。由于您几乎可以在结构内定义任何内容,因此您可以将其用于变量、函数、其他结构等。基本上您所要做的就是将现有代码包装在 struct Holder {}
括号内。
通过将内部的所有内容设为静态,您可以像容器一样使用它,并在外部使用 Holder.S
等引用内容。
如果我在模块级别定义结构,我可以引用尚未定义的结构。
struct S {
ComesLater c;
}
struct ComesLater {}
但是如果我在 unittest
或功能块中执行相同的操作,它就不起作用:
unittest {
struct S {
ComesLater c;
}
struct ComesLater {}
}
Error: undefined identifier 'ComesLater'
这是为什么?如何在函数内获得与顺序无关的声明? d中是否有某种前向声明?我需要这个,因为我使用 mixin 生成结构,并且如果存在循环引用结构,则按照其内部依赖关系的顺序对声明进行排序将是相当大的努力,有时甚至是不可能的。 (使用指针。)
函数、单元测试或任何其他可以实际执行语句的地方的声明确实是依赖于顺序的,因为它们的值可能取决于它们之前的代码运行。想一个局部变量:
int a;
writeln(a);
a = b;
int b = get_user_line();
如果那里的顺序不重要,那么什么时候调用这两个函数?当声明被重写时,是否会要求用户在 writeln 之前输入一行?
使 b 成为未定义变量错误的当前行为使其简单明了。
它的工作独立于其他上下文中的顺序,因为没有它可以依赖的可执行代码,所以如果编译器需要在内部以不同方式考虑它,则没有可以更改的行为。
所以:
How can I get order-independent declarations inside functions?
更改上下文,使没有可执行代码...将其全部放在另一个结构中!
void main() { // or unittest { }
struct Holder {
static struct S {
C c;
}
static struct C {}
}
}
由于执行发生在 holder 周围,而不发生在 holder 内部,因此内部声明的顺序不再重要。由于您几乎可以在结构内定义任何内容,因此您可以将其用于变量、函数、其他结构等。基本上您所要做的就是将现有代码包装在 struct Holder {}
括号内。
通过将内部的所有内容设为静态,您可以像容器一样使用它,并在外部使用 Holder.S
等引用内容。