簡體   English   中英

在哪里可以找到 Delphi“編譯器魔術”聲明的完整列表?

[英]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等。

是魔術功能的官方列表。 關於類型和常量的好運!

似乎很遺憾,沒有人決定制造一個,所以我會。 我不能說這是一個全面的清單。 它僅僅是我從文檔或通過檢查缺少標識符的來源收集的內容。 如果您發現遺漏,請隨時編輯答案。

條件符號

許多條件符號根據編譯器的版本和目標平台而有所不同,但無論版本或平台如何,都應定義以下內容:

  • DCC
  • VER <nnn>

常量

  • CompilerVersion
  • MAXINT
  • MaxLongint

例程

  • 阿布斯
  • 地址
  • 附加
  • 斷言
  • 分配
  • 分配
  • AssignFile
  • BlockRead
  • BlockWrite命令
  • 打破
  • CHR
  • CloseFile
  • CONCAT
  • 繼續
  • 復制
  • 十二月
  • 部署
  • EOF
  • EOLN
  • 抹去
  • 排除
  • 出口
  • FilePos
  • 文件大小
  • FillChar
  • 最終確定
  • 紅暈
  • freemem在
  • 你好
  • 公司
  • 包括
  • 初始化
  • 插入
  • 長度
  • 強的松
  • PTR
  • Readln
  • ReallocMem
  • 改名
  • 重啟
  • 改寫
  • 回合
  • RunError
  • 尋求
  • SeekEof
  • SeekEoln
  • SetLength
  • 的SetString
  • 中SizeOf
  • 切片
  • SQR
  • STR
  • SUCC
  • 交換
  • TRUNC
  • 類型句柄
  • 所屬類別
  • 類型
  • 瓦爾
  • VarCast
  • VarCopy
  • Writeln

這里似乎只適用於linux(至少在我使用的版本中):

  • open它在SysUtils.FileCreate中引用,但沒有在代碼庫中的任何位置定義該簽名的open函數。 System.__open具有相同的簽名並指向libc open函數,但未在System單元外部引用,因此編譯器必須做更多“魔術”以解析對__open open

類型

  • ANSIChar類型
  • 布爾
  • 字節
  • ByteBool
  • 樞機主教
  • 燒焦
  • 比較
  • 貨幣
  • 擴展
  • Int64的
  • 整數
  • LongBool這
  • Longint型
  • 長字
  • NativeInt
  • NativeUInt
  • OleVariant
  • 指針
  • 真實
  • Real48
  • ShortInt
  • ShortString短
  • SMALLINT
  • string(保留字,但如果你編寫System.string,你可以“Ctrl + Click”)
  • 文本
  • 文本文件
  • 答:64
  • 的UnicodeString
  • 變種
  • WideChar
  • WideString的
  • WordBool

在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 因此雖然它確實很特別,但我認為它的特殊性與IntegerAssert特別相同。

對於程序和功能,進入系統單元並查找注釋:

{ Procedures and functions that need compiler magic }

下面可能是一個相當完整的清單。 只需從每個例程名稱中刪除前導下划線即可。

對於關鍵字,Delphi基礎知識列表:

主要是“編譯器魔法”,在任何單位都未聲明。

對於常數,短名單包括:MaxInt,MaxLongInt,Nil和Pi。

正如肯所說,你可以找到靠近系統單元頂部的大多數類型。

我來到這里是為了尋找圍繞 System.pas 中函數和過程的前導下划線的魔法。

我發現實用工具DCU32INT (即解析* .dcu文件,並將其轉換成一個接近帕斯卡形式),也github上 例如,它允許您查看您正在尋找的內置編譯器定義的函數

功能塊讀取

以及在 system.pas 源中看到的魔法,比如

函數_BlockRead

從 .dcu 文件中顯示的帶有前導“@”符號(本地符號?)的函數為:

函數@BlockRead

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM