5

考虑以下代码:

static if (!is(MyStruct))
{
    struct MyStruct
    {
    }
}

static if (is(MyStruct))
{
    static assert(0);
}

我最初的理解是声明的顺序(在全局范围内)在 D中并不重要。

但是,在这种情况下,static ifs 的顺序决定了程序是否编译。

因此,D 的编译时评估阶段是过程特性(如 C/C++)、声明特性还是其他?目前是什么,计划是什么(如果两者不同)?


编辑:

我才意识到,问题还不止于此。static if使用.tupleof枚举当前模块的成员并创建相同类型的问题会发生什么?

4

2 回答 2

2

它是一种声明性功能,具有作为实现的副作用的过程属性。

于 2011-10-28T09:46:00.707 回答
2

它变得复杂。static if它本质上是声明性的,但是当 a引入一个新符号时,顺序仍然很重要。除此之外,我认为它并不重要,但是正如您的示例所示,当您在 a 中引入一个新符号static if并且另一个static if使用它时,顺序肯定很重要。

最近有一些关于如何使其尽可能一致和直观的讨论。因此,特别是在极端情况下,情况可能会在不久的将来发生变化。但我希望您的示例将继续触发static assert. static assert问题是如果你颠倒块的顺序,它是否会开始触发static if,我不确定这是否真的已经决定了。编译器新闻组中关于它的讨论并不完全是决定性的,而且有点难以理解恕我直言,所以我不能肯定地说。但我希望至少在某些涉及static if引入新符号的块的情况下,排序仍然很重要。

编辑:

这是dmd 的主要贡献者之一最近发布的:

目前没有定义编译时求值的顺序;DMD 目前按词汇顺序模糊地执行此操作,但计划在不久的将来更改。'static if' 和 'mixin' 将在执行任何其他操作之前按词汇顺序进行评估。之后,将按需评估其他所有内容。

除了“静态 if/mixin”传递之外,编译可以并行进行(尽管当前的实现还没有这样做),这意味着没有排序(多个项目可以同时完成编译)。

所以,希望这能澄清事情。

于 2011-10-28T18:14:04.270 回答