2013-06-25 7 views
9

Un mio collega urtò una costante che improvvisamente aveva "cambiato valore";
scoperto, è stato dichiarato nuovamente:Perché il compilatore Delphi non avvisa per una costante ridefinita?

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; 

Questo dimostra 2. Se si scambia l'ordine dell'unità nell'istruzione Usi, viene visualizzato 1.

Fine, ma perché il compilatore Delphi non avvisa del nome costante duplicato (Sarebbe molto utile)?
C'è qualcosa che posso fare per abilitare gli avvertimenti (non sembra in questo modo).

+4

ma non è così, suppongo che dovresti chiedere ai forum EMB perché questo non sta alzando una bandiera rossa ..., lo stesso vale per le funzioni, le classi, ecc. – ComputerSaysNo

+1

Perché? Perché può anche essere una grande risorsa per poter dichiarare un simbolo/tipo con lo stesso nome in un'unità diversa e metterlo più vicino all'oggetto dell'unità in uso rispetto all'unità in cui il simbolo/tipo è stato originariamente dichiarato. Le classi di Interposer, ad esempio, non sarebbero possibili senza di essa. –

+0

@MarjanVenema true, tuttavia, alcune persone preferirebbero essere avvisate di questo caso invece di cacciare insetti ... – ComputerSaysNo

risposta

6

A causa delle regole di scoping documentate da Delphi. Dalla Guida linguistica:

L'ordine in cui le unità appaiono nella clausola uses determina l'ordine della loro inizializzazione e influenza il modo in cui identificatori sono situato dal compilatore. Se due unità dichiarano una variabile, una costante, un tipo, una procedura o una funzione con lo stesso nome, il compilatore utilizza lo dall'unità elencata per ultimo nella clausola uses. (Per accedere alla identificatore dall'altra unità, si dovrebbe aggiungere un qualificatore:. UnitName.Identifier) ​​

Questo è il comportamento previsto dal Turbo Pascal 4.0, che ha introdotto le unità.

+0

Sì, ma * Perché il compilatore Delphi non avvisa? * È la domanda. –

+2

Perché si tratta di un comportamento atteso documentato dal 1987. Perché dovrebbe avvisare di un comportamento previsto e documentato? Dovrebbe avvisare quando una variabile locale nasconde una scoper esterna? O un metodo di classe nasconde una procedura o una funzione? Riceverai così tanti avvertimenti che sarebbero inutili. In Delphi l'ordine di dichiarazione dell'unità ** non è ** irrilevante. Lo sviluppatore deve elencare le unità nell'ordine corretto. A volte le persone dovrebbero leggere la documentazione ufficiale sulla lingua che usano. Google o StackOverflow no. –

+1

Quasi tutti gli avvisi del compilatore in realtà mettono in guardia sul comportamento previsto e documentato. Gli avvisi del compilatore possono essere controllati, attivati ​​e disattivati. L'effetto globale dell'uso di un'unità e dell'impatto sullo spazio dei nomi è un'enorme debolezza di Delphi. Gli avvertimenti sarebbero preziosi. Ma questo è oltre il punto. La domanda ha posto una domanda che semplicemente non hai affrontato.La domanda è "perché"? –

Problemi correlati