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 等。
答案 0 :(得分:9)
this是神奇功能的官方列表。关于类型和常量的好运!
答案 1 :(得分:6)
似乎很遗憾,没有人决定制作一个,所以我愿意。 我不能说这是一个综合列表。它仅仅是我从文档或通过检查缺少标识符的来源收集的内容。如果您发现遗漏,请随时编辑答案。
许多条件符号因编译器的版本和目标平台而异,但无论版本或平台如何,都应定义以下内容:
<nnn>
这里似乎只适用于linux(至少在我正在使用的版本中):
open
函数,在代码库中的任何位置都定义了该签名。 System.__open
具有相同的签名并指向libc open
函数,但未在系统单元外引用,因此编译器必须更加“神奇”地将open
解析为{{1} }。答案 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
的东西。因此虽然它确实很特别,但我并不认为它的特殊性与Integer
和Assert
特别相同。
答案 5 :(得分:0)
对于程序和功能,进入系统单元并查找注释:
{ Procedures and functions that need compiler magic }
下面可能是一个相当完整的列表。只需从每个例程名称中删除前导下划线。
对于关键字,Delphi基础知识列表:
主要是“编译器魔术”,在任何单位都未声明。
对于常数,短名单包括:MaxInt,MaxLongInt,Nil和Pi。
正如肯所说,你可以找到系统单元顶部附近的大部分类型。