9

私の同僚は、突然「値が変わった」定数にぶつかりました。
結局のところ、それは再宣言されました:

unit Unit1;

interface

const
   MyConstant = 1;

implementation

end.

--

unit Unit2;

interface

const
   MyConstant = 2;

implementation

end.

--

Uses Unit1, Unit2;
// Uses Unit2, Unit1;

procedure TFrmRedefineConstant.FormShow(Sender: TObject);
begin
   ShowMessage('MyConstant: ' + IntToStr(MyConstant));
end;

これは を示しています2。Uses ステートメントで単位の順序を入れ替えると、 が表示されます1

わかりましたが、Delphi コンパイラが定数名の重複について警告しないのはなぜですか (これは非常に役に立ちます)。
警告を有効にするためにできることはありますか (そのようには見えません)。

4

1 に答える 1

6

Delphi に文書化されたスコープ ルールがあるためです。言語ガイドから:

ユニットが uses 句に現れる順序によって、ユニットの初期化の順序が決まり、コンパイラが識別子を見つける方法に影響します。2 つのユニットが同じ名前の変数、定数、型、プロシージャ、または関数を宣言する場合、コンパイラは uses 句で最後にリストされたユニットのいずれかを使用します。(他のユニットから識別子にアクセスするには、修飾子: UnitName.Identifier を追加する必要があります。)

これは、単位が導入された Turbo Pascal 4.0 以降の予想される動作です。

于 2013-06-25T12:14:49.870 に答える