[英]Where can I find a comprehensive list of Delphi "compiler magic" declarations?
system.pas 頂部的評論指出:
{ Predefined constants, types, procedures, }
{ and functions (such as True, Integer, or }
{ Writeln) do not have actual declarations.}
{ Instead they are built into the compiler }
{ and are treated as if they were declared }
{ at the beginning of the System unit. }
顯然,這遠不是一份完整的清單。 有誰知道我在哪里可以找到完整的列表?
編輯:到目前為止,我得到的答復似乎對我正在尋找的內容有些困惑。 我試圖找到編譯器識別但未在任何單元中聲明的內置常量、類型、過程和函數的列表。 示例包括 High()、Writeln()、Assert()、 string等。
這是魔術功能的官方列表。 關於類型和常量的好運!
似乎很遺憾,沒有人決定制造一個,所以我會。 我不能說這是一個全面的清單。 它僅僅是我從文檔或通過檢查缺少標識符的來源收集的內容。 如果您發現遺漏,請隨時編輯答案。
許多條件符號根據編譯器的版本和目標平台而有所不同,但無論版本或平台如何,都應定義以下內容:
<nnn>
這里似乎只適用於linux(至少在我使用的版本中):
open
函數。 System.__open
具有相同的簽名並指向libc open
函數,但未在System單元外部引用,因此編譯器必須做更多“魔術”以解析對__open
open
。 在System.pas中可以找到一些內部定義的類型(Delphi 2010 Update 4附帶的版本中的第90行)。 您可以通過搜索“內置類型”輕松找到它們; 有一個{$ EXTERNALSYM}的C ++ Builder聲明列表,可以找到像String,AnsiString等的東西。
至於程序和功能,我不知道任何列表。 盡管如此,Allen Bauer或Barry Kelly可能會發現這一點並能夠提供幫助。
類型和內容列表也不是官方的,但如果您有,可以從System.pas源中推斷出來。 它還取決於編譯器的類型(支持Unicode,Kylix,.NET等)。
這是Delphi 2010 System.pas的相關部分:
{$EXTERNALSYM CompilerVersion}
{$EXTERNALSYM Boolean 'bool' } {$OBJTYPENAME Boolean 'Bo'}
{$NODEFINE ShortInt 'ShortInt' } {$OBJTYPENAME ShortInt 'Bzc'} { signed char }
{-EXTERNALSYM ShortInt 'signed char' } {-OBJTYPENAME ShortInt 'Bzc'}
{$EXTERNALSYM SmallInt 'short' } {$OBJTYPENAME SmallInt 'Bs'}
{$EXTERNALSYM Integer 'int' } {$OBJTYPENAME Integer 'Bi'}
{$NODEFINE Byte 'Byte' } {$OBJTYPENAME Byte 'Buc'} { unsigned char }
{$NODEFINE Word 'Word' } {$OBJTYPENAME Word 'Bus'} { unsigned short }
{$EXTERNALSYM Cardinal 'unsigned' } {$OBJTYPENAME Cardinal 'Bui'}
{$EXTERNALSYM Int64 '__int64' } {$OBJTYPENAME Int64 'Bj'}
{$EXTERNALSYM UInt64 'unsigned __int64' } {$OBJTYPENAME UInt64 'Buj'}
{$EXTERNALSYM NativeInt 'int' } {$OBJTYPENAME NativeInt 'Bi'}
{$EXTERNALSYM NativeUInt 'unsigned' } {$OBJTYPENAME NativeUInt 'Bui'}
{$EXTERNALSYM Single 'float' } {$OBJTYPENAME Single 'Bf'}
{$EXTERNALSYM Double 'double' } {$OBJTYPENAME Double 'Bd'}
{$NODEFINE Extended 'Extended' } {$OBJTYPENAME Extended 'Bg'} { long double }
{$NODEFINE Currency 'Currency' 'CurrencyBase' } {$OBJTYPENAME Currency 'NCurrency'}
{$NODEFINE Comp 'Comp' 'CompBase' } {$OBJTYPENAME Comp 'NComp'}
{$EXTERNALSYM Real 'double' } {$OBJTYPENAME Real 'Bd'}
{$NODEFINE ShortString 'ShortString' 'ShortStringBase' } {$OBJTYPENAME ShortString 'N%SmallString$iuc$255%'}
{$NODEFINE OpenString 'OpenString' } {$OBJTYPENAME OpenString 'Bxpc'} { char * const }
{$NODEFINE File 'file' } {$OBJTYPENAME File 'Nfile'}
{$NODEFINE Text 'TextFile' } {$OBJTYPENAME Text 'NTextfile'}
{$NODEFINE ByteBool 'ByteBool' } {$OBJTYPENAME ByteBool 'Buc'} { unsigned char }
{$NODEFINE WordBool 'WordBool' } {$OBJTYPENAME WordBool 'Bus'} { unsigned short }
{$EXTERNALSYM LongBool 'BOOL' } {$OBJTYPENAME LongBool 'Bi'} { int } { from windef.h }
{$NODEFINE Real48 } { not supported in C++ }
{$EXTERNALSYM Pointer 'void *' }
{$NODEFINE PWideChar 'WideChar *'}
{$EXTERNALSYM PAnsiChar 'char *' }
{$NODEFINE Variant } { defined in sysvari.h }
{$NODEFINE OleVariant } { defined in sysvari.h }
{$NODEFINE LongInt } { alias of Integer }
{$NODEFINE LongWord } { alias of Cardinal }
{$NODEFINE TextFile } { alias of Text }
{$IFDEF UNICODE}
{$EXTERNALSYM AnsiChar 'char' } {$OBJTYPENAME AnsiChar 'Bc'}
{$IFDEF LINUX}
{$NODEFINE Char 'WideChar' } {$OBJTYPENAME Char 'Bus'} { unsigned short }
{-OBJTYPENAME Char 'BCs'} { char16_t }
{$ELSE}
{$NODEFINE Char 'WideChar' } {$OBJTYPENAME Char 'Bb'} { wchar_t }
{-OBJTYPENAME Char 'BCs'} { char16_t }
{$ENDIF}
{$NODEFINE string 'UnicodeString' } {$OBJTYPENAME string 'NUnicodeString'} { defined in vcl/ustring.h }
{-NODEFINE string 'String' } {$OBJTYPENAME string 'NUnicodeString'} { defined in vcl/ustring.h }
{$NODEFINE AnsiString } { defined in vcl/dstring.h }
{$NODEFINE WideString } { defined in vcl/wstring.h }
{$NODEFINE PChar } { alias of PWideChar }
{$NODEFINE WideChar } { alias of Char }
{$NODEFINE UnicodeString} { alias of string }
{$ELSE}
{$EXTERNALSYM Char 'char' } {$OBJTYPENAME Char 'Bc'}
{$IFDEF LINUX}
{$NODEFINE WideChar 'WideChar' } {$OBJTYPENAME WideChar 'Bus'} { unsigned short }
{-OBJTYPENAME WideChar 'BCs'} { char16_t }
{$ELSE}
{$NODEFINE WideChar 'WideChar' } {$OBJTYPENAME WideChar 'Bb'} { wchar_t }
{-OBJTYPENAME WideChar 'BCs'} { char16_t }
{$ENDIF}
{$NODEFINE string 'AnsiString' } { defined in vcl/dstring.h }
{-NODEFINE string 'String' } { defined in vcl/dstring.h }
{$NODEFINE WideString } { defined in vcl/wstring.h }
{$NODEFINE UnicodeString} { defined in vcl/ustring.h }
{$NODEFINE PChar } { alias of PAnsiChar }
{$NODEFINE AnsiChar } { alias of Char }
{$NODEFINE AnsiString } { alias of string }
{$ENDIF}
--jeroen
現成列表的最佳選擇是系統文檔 。 它列出了許多類型和函數,它有一個單獨的常量列表鏈接,盡管列表比我預期的要短。 不過,這份名單並非完全神奇。 例如, TInterfacedObject
並沒有什么特別之處,但它來自系統單元,所以它在列表中。
您實際上無法獲得所有編譯器魔術聲明的列表。 他們是神奇的,因為他們無法宣布。 您不能擁有High
函數的聲明,因為它適用於尚未發明的類型(即任何枚舉類型)。 而且你不能聲明Writeln
因為它需要任意數量的參數,並且它支持語言中其他地方不允許的語法。
你可以做的是有一個標識符列表。 它們是編譯器知道如果它們解析為指定屬於系統單元的東西而特別處理的標識符,但我們仍然可以使用它來在程序的其他地方進行我們自己的聲明。 如果需要,您可以聲明自己的Writeln
函數。 你的問題提到了string
,但這是一個保留字; 你不能聲明你自己的東西叫做string
。 因此雖然它確實很特別,但我認為它的特殊性與Integer
和Assert
特別相同。
對於程序和功能,進入系統單元並查找注釋:
{ Procedures and functions that need compiler magic }
下面可能是一個相當完整的清單。 只需從每個例程名稱中刪除前導下划線即可。
對於關鍵字,Delphi基礎知識列表:
主要是“編譯器魔法”,在任何單位都未聲明。
對於常數,短名單包括:MaxInt,MaxLongInt,Nil和Pi。
正如肯所說,你可以找到靠近系統單元頂部的大多數類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.