1

があると考えてくださいmoda.d

module moda;

private struct modb {};

そしてmodb.d

module modb;

private import moda;

そしてmodmain.d

module modmain;

static import moda;
static import modb;

void main() {
    modb v; // should NOT compile, should it?
}

理由はわかりませんが、とmoda.modbの両方に表示されますが、私が理解している限り、どちらもasとbeingとしてインポートされているため、表示されるべきではありません。それともすべきですか?私はdmdバグに遭遇しましたか、それとも私が理解していなかった計画された動作ですか?modmainmodbmodastaticmoda.modbprivate

Update1:バグが複製される状況を特定するために、いくつかのテストを実行しました。

1 列目はimport moda、2 列目はimport modb、3 列目は構造体名として使用される識別子です。そこにあるすべてのテストはコンパイルに失敗するはずですが、一部はコンパイルされます。

凡例: D - 「インポート モジュール;」、S - 「静的インポート モジュール;」、N - インポートなし。

D;D;foobar - バグ #2830 によるコンパイル

S;D;foobar - 期待どおりに失敗する

N;D;foobar - 期待どおりに失敗する

D;S;foobar - バグ #2830 によるコンパイル

S;S;foobar - 期待どおりに失敗する

N;S;foobar - 期待どおりに失敗する

D;N;foobar - バグ #2830 によるコンパイル

S;N;foobar - 期待どおりに失敗する

N;N;foobar - 期待どおりに失敗する

D;D;moda - バグ #2830 によるコンパイル

S;D;moda - コンパイルしないでください

N;D;moda - コンパイルしないでください

D;S;moda - バグ #2830 によるコンパイル

S;S;moda - コンパイルしないでください

N;S;moda - 期待どおりに失敗する

D;N;moda - バグ #2830 によるコンパイル

S;N;moda - コンパイルしないでください

N;N;moda - 期待どおりに失敗する

D;D;modb - バグ #2830 によるコンパイル

S;D;modb - コンパイルしないでください

N;D;modb - コンパイルしないでください

D;S;modb - バグ #2830 によるコンパイル

S;S;modb - コンパイルしないでください

N;S;modb - コンパイルしないでください

D;N;modb - バグ #2830 によるコンパイル

S;N;modb - 期待どおりに失敗する

N;N;modb - 期待どおりに失敗します

一部のモジュールの名前が公開されていないシンボルと同じ場合、保護レベルに関係なく公開されているようです。

4

2 に答える 2

1

これはバグ#2830であり、静的インポートとは何の関係もありません。静的を使用するかどうかに関係なく、同じ問題が発生します。また、モジュールmodbもそれとは何の関係もありません。それを完全に削除しても、同じ状況になる可能性があります。

また、コードに関するいくつかのサイドノート:

  1. 置く; そのような構造体またはクラス宣言の終わりには、Dでは不要です。

  2. インポートのプライベートは何もしません。それらは自動的にプライベートになります。

  3. モジュール名と同じ名前のシンボルを使用すると、それらを使用するときに完全なインポートパスを指定する必要が生じる可能性があります。複数レベルのパッケージを使用する場合(egabcではcを使用するときにフルパスを使用する必要はありませんが、aaは通常aではなくaaとして使用する必要があります)、それほど大きな問題ではありませんが、パッケージのレベルが1つあると、問題が発生します。通常、モジュール名はすべて小文字ですが、型名はPascalCaseであり、変数名と関数名はキャメルケースです。この場合、このような問題はあまり発生しません(つまり、単一レベルのパッケージがあり、たった1語の長さのキャメルケース記号)。したがって、より一般的なD命名規則に従うと、問題を回避するのに役立ちます。また、他のDプログラマーが期待するものになる傾向があります。しかし、それは明らかにプログラマーによって異なります。それただし、標準ライブラリが行うことです

于 2012-04-08T01:53:30.963 に答える
0

この種の動作については、バグ #7856 を埋めました。

于 2012-04-08T11:19:53.763 に答える