请考虑以下代码:
static if (!is(MyStruct))
{
struct MyStruct
{
}
}
static if (is(MyStruct))
{
static assert(0);
}
我最初的理解是声明的顺序(在全局范围内)与D中的无关紧要。
但是,在这种情况下,static if
s的顺序会对程序是否编译产生影响。
D是编译时评估阶段,因此,是一个程序性功能(如C / C ++),一个声明性功能,还是其他什么?目前是什么,计划是什么(如果两者不同)?
我刚刚意识到,这个问题甚至还没有结束。 static if
使用.tupleof
枚举当前模块的成员,并创建相同类型的问题会发生什么?
答案 0 :(得分:2)
这是一个声明性功能,具有程序属性作为实现的副作用。
答案 1 :(得分:2)
这很复杂。它本质上是声明性的,但是当static if
引入新符号时,顺序仍然很重要。除此之外,我不相信这一点很重要,但正如您的示例所示,当您在static if
中引入新符号,而另一个static if
使用它时,顺序肯定很重要。
最近有some discussion关于如何使其尽可能一致和直观。因此,特别是在极端情况下,情况可能会在不久的将来发生变化。但我希望你的例子会继续触发static assert
。问题是,如果你颠倒static assert
块的顺序,它是否会开始触发static if
,我不确定那是否真的已经确定了。 discussion on it in the compiler's newsgroup并不完全是结论性的,有点难以跟随恕我直言,所以我不能肯定地说。但我希望在至少某些涉及引入新符号的static if
块的情况下,排序仍然很重要。
修改强>
这是dmd的主要贡献者之一recently posted:
目前,没有定义编译时评估的顺序; DMD 目前它在词汇顺序上模糊不清,但计划这样做 在不久的将来改变。 'static if'和'mixin'将被评估 在词汇顺序中,在完成任何其他事情之前。然后, 其他一切都将按需评估。
除了“静态if / mixin”传递之外,编译可以继续进行 并行(虽然目前的实现还没有这样做) 意味着没有排序(多个项目可能完成编译 同时地)。
所以,希望澄清事情。