2013-06-25 12 views
9

Mój kolega wpadł w stałą, która nagle zmieniła wartość;
okazało, był redeclared:Dlaczego kompilator Delphi nie ostrzega o zdefiniowanej na nowo stałej?

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; 

To pokazuje 2. Jeśli zamienisz kolejność jednostek w instrukcji Uses, wyświetli się 1.

Dobrze, ale dlaczego kompilator Delphi nie ostrzega o duplikacie stałej nazwy (byłoby to bardzo pomocne)?
Czy jest coś, co mogę zrobić, aby włączyć ostrzeżenia (nie wygląda to w ten sposób).

+4

Mogło, ale nie, myślę, że powinieneś zapytać na forach EMB, dlaczego nie jest to podniesienie czerwonej flagi ..., to samo dotyczy funkcji, klas, itp. – ComputerSaysNo

+1

Dlaczego? Ponieważ może to być również wielki atut, aby móc zadeklarować symbol/typ o tej samej nazwie w innej jednostce i umieścić go bliżej zakresu stosowania jednostki niż jednostka, w której pierwotnie deklarowano symbol/typ. Na przykład klasy interposerów nie byłyby możliwe bez niego. –

+0

@MarjanVenema prawda, jednak niektórzy ludzie woleliby być powiadamiani o tej sprawie zamiast polować na robaki ... – ComputerSaysNo

Odpowiedz

6

Z powodu Delphi udokumentowane reguły scoping. Z Języka Przewodnik:

Kolejność, w jakiej pojawiają się jednostki klauzuli uses określa kolejność ich inicjowania i wpływa na sposób identyfikatory się przez kompilator. Jeśli dwie jednostki zadeklarują zmienną, stałą, typ , procedurę lub funkcję o tej samej nazwie, kompilator używa wartości z jednostki wymienionej jako ostatnia w klauzuli uses. (Aby uzyskać dostęp do identyfikatora z innej jednostki , trzeba by dodać kwalifikator. UnitName.Identifier) ​​

Jest to oczekiwane zachowanie od Turbo Pascal 4.0, która wprowadziła jednostek.

+0

Tak, ale * Dlaczego ostrzeżenie kompilatora Delphi? * Jest pytaniem. –

+2

Ponieważ jest to udokumentowane oczekiwane zachowanie od 1987 roku. Dlaczego ma ostrzegać przed oczekiwanym i udokumentowanym zachowaniem? Czy powinien ostrzegać, gdy lokalna zmienna ukrywa zewnętrzne skalery? Lub metoda klasy ukrywa procedurę lub funkcję? Dostaniesz tyle ostrzeżeń, że będą bezużyteczne. W Delphi zamówienie deklaracji jednostkowej ** nie jest ** nieistotne. Programista musi wyświetlić jednostki w odpowiedniej kolejności. Czasami ludzie powinni przeczytać oficjalną dokumentację na temat języka, którego używają. Google lub StackOverflow nie są. –

+1

Prawie wszystkie ostrzeżenia kompilatora ostrzegają o oczekiwanym i udokumentowanym działaniu. Ostrzeżenia kompilatora można kontrolować, włączać i wyłączać. Globalny efekt używania jednostki i jej wpływu na przestrzeń nazw jest ogromną słabością Delphi. Ostrzeżenia byłyby cenne. Ale to nie ma znaczenia. Pytanie zadało pytanie, którego po prostu nie podałeś.Pytanie brzmi "dlaczego"? –

Powiązane problemy