5

次のコードを検討してください。

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

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

私の当初の理解では、Dでは(グローバルスコープでの)宣言の順序は重要ではありません。

ただし、この場合、static ifsの順序によって、プログラムがコンパイルされるかどうかが異なります。

したがって、Dのコンパイル時の評価段階は、手続き型機能(C / C ++など)、宣言型機能、またはその他のものですか?それは現在何ですか、そしてそれは何になる予定ですか(2つが異なる場合)?


編集:

問題はここで終わらないことに気づきました。現在のモジュールのメンバーを列挙し、同じタイプの問題を作成するためのstatic if使用はどうなりますか?.tupleof

4

2 に答える 2

2

これは、実装の副作用として手続き型のプロパティを持つ宣言型の機能です。

于 2011-10-28T09:46:00.707 に答える
2

複雑になります。static if基本的には宣言型ですが、 a が新しいシンボルを導入する場合、順序は依然として重要です。それを除けば、それが問題になるとは思いませんが、あなたの例が示すように、 に新しいシンボルを導入し、static if別のシンボルがstatic ifそれを使用する場合、順序は間違いなく重要です。

最近、できるだけ一貫性があり、直感的にできるようにする方法についていくつかの議論がありました。そのため、特にまれなケースでは、近い将来に状況が変わる可能性があります。しかし、あなたの例は引き続きstatic assert. static assert問題は、ブロックの順序を逆にした場合にトリガーが開始されるかどうかであり、static ifそれが本当に決定されているかどうかはわかりません。コンパイラのニュースグループでの議論は完全に決定的なものではなく、私見に従うのは少し難しいので、確かなことは言えません. static ifしかし、新しいシンボルを導入するブロックを含む少なくともいくつかのケースでは、順序付けは依然として重要であると私は予想しています。

編集:

これは最近、dmd の主要な貢献者の 1 人によって投稿されました。

現在、コンパイル時の評価の順序は定義されていません。DMD は現在、辞書的な順序で漠然とそれを行っていますが、これは近い将来変更される予定です。'static if' と 'mixin' は、他の処理が行われる前に字句順に評価されます。その後、他のすべてがオンデマンドで評価されます。

「静的 if/mixin」パスとは別に、コンパイルは並行して進めることができます (ただし、現在の実装ではまだこれを行っていません)。これは、順序がないことを意味します (複数の項目が同時にコンパイルを完了する可能性があります)。

それで、うまくいけば、それは物事を明確にします。

于 2011-10-28T18:14:04.270 に答える