2013-06-25 69 views
9

我的一位同事撞上了一個突然「變價」的常數;
橫空出世,它被重新聲明:爲什麼Delphi編譯器不會警告重定義的常量?

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

它可能但它沒有,我想你應該在EMB論壇上詢問爲什麼這不會引發紅旗......,這同樣適用於函數,類等。 – ComputerSaysNo

+1

爲什麼?因爲它也可以是一個很好的資產,能夠在不同的單元中聲明一個具有相同名稱的符號/類型,並且比使用最初聲明符號/類型的單元更接近使用單元的範圍。例如,插入器類將不可能沒有它。 –

+0

@MarjanVenema真的,但是,有些人寧願被告知這種情況,而不是尋找錯誤... – ComputerSaysNo

回答

6

由於Delphi記錄的範圍規則。從語言指南:

在哪個單位出現在使用子句中的順序決定了 爲了自己的初始化和影響方式標識符 位於編譯器。如果兩個單元使用相同的名稱聲明變量,常量,類型,過程或函數,編譯器將使用來自uses子句中最後一個列出單元的 。 (要訪問其他單元的 標識,你就必須添加一個限定詞: UnitName.Identifier)

這是自從Turbo Pascal的4.0,它引入了單位的預期行爲。

+0

是的,但*爲什麼Delphi編譯器警告?*是問題。 –

+2

因爲這是自1987年以來有記錄的預期行爲。爲什麼它應該警告預期和記錄的行爲?它應該警告當一個局部變量隱藏外部的勺子?或者一個類方法隱藏一個過程或函數?你會得到如此多的警告,他們將是無用的。在Delphi中,單元聲明順序**不是**不相關的。開發者必須按正確的順序列出單元。 有時候,人們應該閱讀他們使用的語言的官方文檔。谷歌或StackOverflow不是。 –

+1

幾乎所有的編譯器警告的確會警告預期和記錄的行爲。編譯器警告可以被控制,打開和關閉。使用一個單位的全球影響和對名字空間的影響是德爾福的一個巨大弱點。警告將是有價值的。但那不是重點。這個問題提出了一個你根本沒有解決的問題。問題是「爲什麼」? –

相關問題