2013-06-25 5 views
9

Ein Kollege stieß auf eine Konstante, die plötzlich den Wert geändert hatte.
Es stellte sich heraus, war es neu deklariert:Warum warnt der Delphi-Compiler vor einer neu definierten Konstante?

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; 

Dies zeigt 2. Wenn Sie die Einheitenreihenfolge in der Uses-Anweisung tauschen, wird 1 angezeigt.

Fein, aber Warum warnt der Delphi-Compiler nicht über den doppelten Konstantennamen (Das wäre sehr hilfreich)?
Kann ich irgendetwas tun, um Warnungen zu aktivieren (sieht nicht so aus).

+4

könnte es, aber es tut nicht, ich denke, Sie sollten auf EMB Foren fragen, warum dies nicht eine rote Fahne anhebt ..., das gleiche gilt für Funktionen, Klassen, etc. – ComputerSaysNo

+1

Warum? Weil es auch ein großer Vorteil sein kann, ein Symbol/einen Typ mit dem gleichen Namen in einer anderen Einheit deklarieren zu können und dies näher in den Bereich für die verwendete Einheit zu bringen als die Einheit, in der das Symbol/der Typ ursprünglich deklariert ist. Interposer-Klassen zum Beispiel wären ohne sie nicht möglich. –

+0

@MarjanVenema wahr, jedoch würden einige Leute lieber über diesen Fall benachrichtigt werden, statt auf Bugs zu jagen ... – ComputerSaysNo

Antwort

6

Aufgrund der dokumentierten Scoping-Regeln von Delphi. Vom Language Guide:

Die Reihenfolge, in der Einheiten in der uses-Klausel bestimmt die Reihenfolge ihrer Initialisierung und wirkt sich auf die Art und Weise Kennungen vom Compiler befinden. Wenn zwei Einheiten eine Variable, eine Konstante, einen Typ, eine Prozedur oder eine Funktion mit demselben Namen deklarieren, verwendet der Compiler den Wert aus der zuletzt in der Klausel uses aufgeführten Einheit. (Für den Zugriff auf die Kennung von der anderen Einheit, würden Sie einen Qualifizierer hinzufügen:. UnitName.Identifier) ​​

Dies ist das erwartete Verhalten, da Turbo Pascal 4.0, die Einheiten eingeführt.

+0

Ja, aber * Warum warnt der Delphi-Compiler nicht? * Ist die Frage. –

+2

Weil es ein dokumentiertes erwartetes Verhalten seit 1987 ist. Warum sollte es vor einem erwarteten und dokumentierten Verhalten warnen? Sollte es warnen, wenn eine lokale Variable einen äußeren Scoper verbirgt? Oder versteckt eine Klassenmethode eine Prozedur oder Funktion? Sie werden so viele Warnungen erhalten, dass sie nutzlos wären. In Delphi ist die Unit-Deklarationsreihenfolge ** nicht ** irrelevant. Der Entwickler muss die Einheiten in der richtigen Reihenfolge auflisten. Manchmal sollten Leute die offizielle Dokumentation über die Sprache lesen, die sie benutzen. Google oder StackOverflow sind nicht. –

+1

Fast alle Compilerwarnungen warnen tatsächlich vor dem erwarteten und dokumentierten Verhalten. Compiler-Warnungen können gesteuert, ein- und ausgeschaltet werden. Der globale Effekt der Verwendung einer Einheit und der Einfluss auf den Namensraum ist eine enorme Schwäche von Delphi. Warnungen wären wertvoll. Aber das ist nebensächlich. Die Frage hat eine Frage gestellt, die Sie einfach nicht gerichtet haben.Die Frage ist "warum"? –

Verwandte Themen