【问题标题】:Where can I find a comprehensive list of Delphi "compiler magic" declarations?我在哪里可以找到 Delphi“编译器魔法”声明的完整列表?
【发布时间】:2009-12-23 15:14:30
【问题描述】:

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

【问题讨论】:

    标签: delphi


    【解决方案1】:

    this 是魔法函数的官方列表。祝你好运!

    【讨论】:

      【解决方案2】:

      没有人决定制作一个,所以我会这样做,这似乎是一种耻辱。 我不能声称这是一个全面的列表。它只是我能够从文档中或通过检查缺少标识符的来源收集到的。如果您发现有遗漏,请随时编辑答案。

      条件符号

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

      • DCC
      • 版本<nnn>

      常量

      • 编译器版本
      • 最大整数
      • MaxLongint

      例程

      • 绝对值
      • 地址
      • 追加
      • 断言
      • 已分配
      • 分配
      • 分配文件
      • 块读取
      • 块写入
      • 休息
      • Chr
      • 关闭
      • 关闭文件
      • 连接
      • 继续
      • 复制
      • 十二月
      • 处理
      • Eof
      • 埃隆
      • 擦除
      • 排除
      • 退出
      • 文件位置
      • 文件大小
      • 填充字符
      • 敲定
      • 冲洗
      • 免费内存
      • 暂停
      • 公司
      • 包括
      • 初始化
      • 插入
      • 长度
      • 奇数
      • 预测
      • 指针
      • 阅读
      • 阅读
      • ReallocMem
      • 重命名
      • 重置
      • 重写
      • 圆形
      • 运行错误
      • 寻找
      • SeekEof
      • SeekEoln
      • 设置长度
      • 设置字符串
      • 大小
      • 切片
      • 平方
      • 力量
      • 成功
      • 交换
      • 截断
      • 类型句柄
      • 类型信息
      • 类型
      • VarCast
      • VarCopy

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

      • 打开 它在 SysUtils.FileCreate 中被引用,但没有open 函数在代码库的任何地方都定义了该签名。 System.__open 具有相同的签名并指向 libc open 函数,但未在系统单元外部引用,因此编译器必须做更多的“魔术”才能将 open 解析为 __open

      类型

      • AnsiChar
      • 布尔值
      • 字节
      • ByteBool
      • 红衣主教
      • 字符
      • 比较
      • 货币
      • 扩展
      • Int64
      • 整数
      • 长布尔型
      • 朗读
      • 长字
      • NativeInt
      • NativeUInt
      • OleVariant
      • 指针
      • 真实
      • Real48
      • ShortInt
      • 短字符串
      • 单人
      • SmallInt
      • 字符串(保留字,但如果您编写 System.string 则可以“Ctrl+单击”)
      • 文字
      • 文本文件
      • UInt64
      • Unicode 字符串
      • 变体
      • 宽字符
      • 宽字符串
      • WordBool

      【讨论】:

        【解决方案3】:

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

        至于程序和功能,我不知道任何地方的任何列表。不过,Allen Bauer 或 Barry Kelly 可能会发现这一点并能够提供帮助。

        【讨论】:

          【解决方案4】:

          类型和常量的列表也不是官方的,但可以从 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】:

            现成列表的最佳选择是the System documentation。它列出了许多类型和函数,并且有一个指向list of constants 的单独链接,尽管该列表比我预期的要短。不过,这份名单并不完全是魔法。比如TInterfacedObject没有什么特别之处,但是它来自System单元,所以在列表中。

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

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

            【讨论】:

            • +1 用于添加指向常量列表文档的链接,并用于解释编译器魔术函数的各种“重载”。
            【解决方案6】:

            对于过程和函数,进入系统单元并查找注释:

            { Procedures and functions that need compiler magic }
            

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

            对于关键字,Delphi Basics 中的列表:

            大部分是“编译器魔法”,在任何单元中都未声明。

            对于常量,简短列表包括:MaxInt、MaxLongInt、Nil 和 Pi。

            正如肯所说,您可以在系统单元顶部附近找到大多数类型。

            【讨论】:

            • 不是梅森想要的。这给出了整个 RTL 的完整列表,而不仅仅是“魔术”列表。
            【解决方案7】:

            我来这里是为了寻找 System.pas 中函数和过程前导下划线周围的魔力。

            我在github 上也找到了实用工具DCU32INT(解析*.dcu 文件并将其转换为接近Pascal 格式)。它允许您查看您正在寻找的内置编译器定义的函数,例如

            函数块读取

            以及在system.pas的源代码中看到的神奇的,比如

            函数_BlockRead

            .dcu 文件中以“@”符号(本地符号?)开头的函数显示为:

            函数@BlockRead

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-06-20
              • 2015-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-12-10
              • 1970-01-01
              相关资源
              最近更新 更多