在哪里可以找到Delphi“编译器魔术”声明的完整列表?

时间:2009-12-23 15:14:31

标签: delphi

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 等。

6 个答案:

答案 0 :(得分:9)

this是神奇功能的官方列表。关于类型和常量的好运!

答案 1 :(得分:6)

似乎很遗憾,没有人决定制作一个,所以我愿意。 我不能说这是一个综合列表。它仅仅是我从文档或通过检查缺少标识符的来源收集的内容。如果您发现遗漏,请随时编辑答案。

条件符号

许多条件符号因编译器的版本和目标平台而异,但无论版本或平台如何,都应定义以下内容:

  • DCC
  • VER <nnn>

常量

  • CompilerVersion
  • MAXINT
  • MaxLongint

例程

  • 阿布斯
  • 地址
  • 追加
  • 断言
  • 分配
  • 分配
  • AssignFile
  • BlockRead
  • BlockWrite命令
  • 人权委员会
  • 关闭
  • CloseFile
  • 的毗连
  • 继续
  • 复制
  • 处置
  • EOF
  • EOLN
  • 粉碎
  • 排除
  • 退出
  • FilePos
  • 文件大小
  • FillChar
  • 的Finalize
  • 冲洗
  • freemem在
  • 暂停
  • 您好
  • 公司
  • 包含
  • 初始化
  • 插入
  • 长度
  • 泼尼松
  • PTR
  • Readln
  • ReallocMem
  • 重命名
  • 重置
  • 重写
  • RunError
  • SeekEof
  • SeekEoln
  • SetLength
  • 的SetString
  • 一下SizeOf
  • 切片
  • SQR
  • 海峡
  • SUCC
  • 交换
  • TRUNC
  • 类型句柄
  • 所属类别
  • TypeOf运算
  • 缬氨酸
  • VarCast
  • VarCopy
  • Writeln

这里似乎只适用于linux(至少在我正在使用的版本中):

  • 开 它在SysUtils.FileCreate中引用,但没有open函数,在代码库中的任何位置都定义了该签名。 System.__open具有相同的签名并指向libc open函数,但未在系统单元外引用,因此编译器必须更加“神奇”地将open解析为{{1} }。

类型

  • ANSIChar类型
  • 布尔
  • 字节
  • ByteBool
  • 基数
  • 字符
  • 小样
  • 货币
  • 扩展
  • 的Int64
  • 整数
  • LongBool这
  • Longint型
  • 长字
  • NativeInt
  • NativeUInt
  • OleVariant
  • 指针
  • Real48
  • ShortInt
  • ShortString短
  • SMALLINT
  • string(保留字,但如果你编写System.string,你可以“Ctrl + Click”)
  • 文本
  • TEXTFILE
  • UINT64
  • 的UnicodeString
  • 变体
  • WideChar
  • WideString的
  • WordBool

答案 2 :(得分:3)

在System.pas中可以找到一些内部定义的类型(在Delphi 2010 Update 4附带的版本中的第90行左右)。您可以通过搜索“内置类型”轻松找到它们;有一个{$ EXTERNALSYM}的C ++ Builder声明列表,可以找到像String,AnsiString等的东西。

就程序和功能而言,我不知道任何列表。但是,艾伦鲍尔或巴里凯利可能会发现这一点并能够提供帮助。

答案 3 :(得分:2)

类型和内容的列表也不是官方的,但如果您有,可以从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

答案 4 :(得分:1)

现成清单的最佳选择是the System documentation。它列出了许多类型和功能,它有一个单独的list of constants链接,尽管列表比我预期的要短。不过,这份名单并非完全神奇。例如,TInterfacedObject没有什么特别之处,但它来自系统单元,所以它在列表中。

您实际上无法获得所有编译器魔术声明的列表。它们很神奇,因为它们无法被宣布。你不能拥有High函数的声明,因为它适用于尚未发明的类型(即任何枚举类型)。并且您不能声明Writeln因为它需要任意数量的参数,并且它支持语言中其他任何地方都不允许的语法。

可以做的是拥有标识符列表。它们是编译器知道如果它们解析为指定属于系统单元的东西而特别处理的标识符,但我们仍然可以使用它来在程序的其他地方进行我们自己的声明。如果需要,您可以声明自己的Writeln函数。你的问题提到了string,但这是一个保留词;你不能声明你自己的名为string的东西。因此虽然它确实很特别,但我并不认为它的特殊性与IntegerAssert特别相同。

答案 5 :(得分:0)

对于程序和功能,进入系统单元并查找注释:

{ Procedures and functions that need compiler magic }

下面可能是一个相当完整的列表。只需从每个例程名称中删除前导下划线。

对于关键字,Delphi基础知识列表:

主要是“编译器魔术”,在任何单位都未声明。

对于常数,短名单包括:MaxInt,MaxLongInt,Nil和Pi。

正如肯所说,你可以找到系统单元顶部附近的大部分类型。