2012-01-03 84 views
13

在Delphi中聲明變量使我想到了一個我無法理解的東西。Delphi保留字和標識符

問題是這樣的:聲明字符串,人們可以觀察到string是一個保留字,同時宣佈其他數據類型,比如整數數據類型修飾符是不是保留字,但一個標識符(即Integer,資本我這樣講)。實際上,Delphi允許你去定義Integer,你發現它的定義包含在System單元中,但它只是代表性的,因爲有一條評論指出一些常量(如True),標識符(如Integer),函數和過程直接內置於編譯器中。

我無法弄清楚這個選擇背後的原因。

有人可以幫忙嗎?


stringInteger類型之間的區別的一點解釋。下面的代碼

type 
    Integer = Char; 

var 
    I: Integer; 

begin 
    I:= 'A'; 
    ShowMessage(I); 
end; 

是正確的,按預期工作,而下一行

type 
    string = Integer; 

給編譯時錯誤。

+4

Delphi *不區分大小寫。 – 2012-01-03 14:29:50

+2

是的,我知道。儘管Delphi不區分大小寫,但根據InfixCaps約定,它被認爲是一種很好的編程習慣。我也一樣, – 2012-01-03 14:33:51

+5

+1,因爲這是一個有趣的問題,儘管可能沒有「明確的」答案。然而,我個人的猜想是,'string'類型被很多compuler魔法所包圍,所以它被提升爲'保留字'而不是'Ctrl +可點擊的內置類型'... – 2012-01-03 14:44:56

回答

7

據我所知string是Turbo Pascal時代以來的保留字。所以保持這種方式的原因必須是兼容性的。

Pascal - > Turbo Pascal - > Object Pascal - > Delphi。

檢查這些資源。

+2

起初,我相信,'string'被列爲由Borland作爲所謂的「結構化」的類型之一,以'array'和'record'一起,因爲它有額外的語法元素它(方括號,最大長度說明)。因此它不得不成爲一個保留字,用一種特殊的方式進行分析,而不像簡單的類型,它們只是標識符,比如'Integer'或'Real'。 – 2012-01-03 15:49:59

+0

@AndriyM它仍然有額外的語法元素 – 2012-01-03 15:50:41

+1

@DavidHeffernan:是的,在「老辦法」時,它會自動認爲是'ShortString',我知道了。我的觀點是,最初它嚴格地說是一種結構類型。現在它更常用作簡單的字符串(指針)類型(語法上),並且由於舊用法的支持,它可能必須保留爲保留字。 – 2012-01-03 16:00:35

4

string必須保留字,因爲它並非專門用於指代System.[Ansi|Unicode]String類型。如果string是某些內部編譯器類型的簡單別名,那麼string[20]將不再起作用。這對於Integer不是問題,因爲Integer總是意味着「System.Integer」類型。

+1

我懷疑這個字符串*必須*是一個保留字;我寧願認爲turbo pascal編譯器設計器實現'string'作爲保留字更容易。 – kludg 2012-01-03 16:01:31

+0

好的。如果'type'不是'string',或者'string'不解析爲'System.UnicodeString',你可以創建一個允許任何'type [length]'類型的解析器併發出錯誤。但你爲什麼? – hvd 2012-01-03 17:38:14