代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

在哪里可以找到Delphi“编译器魔力”声明的全面列表?

  •  9
  • Mason Wheeler  · 技术社区  · 15 年前

    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(), 一串 等。

    6 回复  |  直到 9 年前
        1
  •  9
  •   Serguzest    15 年前

    this 是魔法函数的正式列表。祝类型和常量好运!

        2
  •  6
  •   hubalazs Kenneth Cochran    9 年前

    没有人决定这么做,我觉得很遗憾。 我不能说这是 综合的 列表。这仅仅是我从文档中或者通过检查源代码中丢失的标识符所收集到的信息。如果你发现有遗漏,请随意编辑答案。

    条件符号

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

    • DCC
    • 版本 <nnn>

    常量

    • 编译
    • 马辛特
    • 最大长度

    日常工作

    • 防抱死制动系统
    • ADDR
    • 追加
    • 断言
    • 分配
    • 赋值
    • 工作分配文件
    • 封锁
    • 块写入
    • 断裂
    • CHR
    • 关闭
    • 关闭文件
    • 连接两个字符串
    • 继续
    • 拷贝
    • 12月
    • 处置
    • EOF
    • 欧隆
    • 擦除
    • 排除
    • 出口
    • 菲洛普斯
    • 文档大小
    • 菲尔查尔
    • 定稿
    • 冲洗
    • 弗莱姆
    • 停顿
    • 您好!
    • 股份有限公司
    • 包括
    • 初始化
    • 插入
    • 长度
    • 新的
    • 奇数
    • 圆周率
    • 普雷德
    • PTR
    • 雷丁
    • RealLogMeM
    • 重命名
    • 重置
    • 重写
    • 回合
    • 运行错误
    • 寻找
    • 塞基夫
    • 塞基尔林
    • 设置长度
    • 固定管柱
    • 西泽
    • 切片
    • SQR
    • STR
    • 苏克
    • 掉期
    • 躯干
    • 类型句柄
    • 类型信息
    • 类型
    • 瓦尔
    • 瓦卡斯特
    • 可变拷贝
    • 书写文字

    这里有一个似乎只适用于Linux(至少在我使用的版本中):

    • 打开 它在sysutils.filecreate中引用,但没有 open 函数,该签名在代码基中的任意位置定义。 System.__open 具有相同的签名并指向libc 打开 函数,但未在系统单元外部引用,因此编译器必须执行更多“魔力”才能解决 打开 __open .

    类型

    • 安西卡
    • 布尔
    • 字节
    • 比特博尔
    • 红衣主教
    • 烧焦
    • COMP
    • 货币
    • 双重的
    • 扩展的
    • 英特64
    • 整数
    • 朗博尔
    • 朗廷
    • 长字
    • 本土化
    • 本土化
    • 橄榄树
    • 指针
    • 真实的
    • Real48
    • 短小的
    • 短字符串
    • 单一的
    • 小字体
    • 字符串(保留字,但如果编写system.string,则可以在上面“ctrl+click”)。
    • 文本
    • 文本文件
    • UIT64
    • 单列字符串
    • 变体
    • 宽字元
    • 宽字符串
    • 沃德布尔
        3
  •  3
  •   Ken White    15 年前

    在system.pas中可以进一步找到一些内部定义的类型(Delphi2010更新4附带的版本中大约有第90行)。在“内置类型”的搜索中,您可以很容易地找到它们;C++Builder中有一个{$ExalalSym }声明的列表,其中可以找到诸如字符串、AnsiString等的东西。

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

        4
  •  2
  •   Jeroen Wiert Pluimers    15 年前

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

    ——杰罗恩

        5
  •  1
  •   Rob Kennedy    15 年前

    对于现成的列表,最好的选择是 the System documentation . 它列出了许多类型和函数,并有一个单独的链接指向 list of constants 虽然清单比我想象的要短。不过,这个名单并不完全是魔术。例如,没有什么特别的 TInterfacedObject 但它来自系统单元,所以它在列表中。

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

    你什么 可以 Do是一个标识符列表。它们是编译器知道特殊处理的标识符,如果它们解析为属于系统单元的东西,但是我们仍然可以使用它们在程序的其他地方进行声明。你可以申报自己的 书写文字 如果你想的话就可以使用。你的问题提到 string ,但这是一个保留字;你不能声明你自己的东西 一串 . 所以尽管它确实很特别,但我不认为它是特别的 Integer Assert 是特殊的。

        6
  •  0
  •   lkessler    15 年前

    有关程序和功能,请进入系统单元并查看注释:

    { Procedures and functions that need compiler magic }
    

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

    对于关键字,delphi basics上的列表:

    大多是“编译器魔法”,在任何单元中都没有声明。

    对于常量,一个简短的列表包括:maxint、maxlongint、nil和pi。

    正如Ken所说,大多数类型都在系统单元的顶部附近。