Комментарий наверху состояний 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. }
Очевидно, это нигде не около всестороннего списка. Кто-либо знает, где я мог найти полный список?
Править: Ответы, которые я имею до сих пор, кажется, немного перепутаны относительно того, что я ищу. Я пытаюсь найти список встроенных констант, типов, процедур и функций, которые компилятор распознает, но не объявляется ни в какой единице. В качестве примера можно привести Высокий (), Writeln (), Утверждают (), строка, и т.д.
это официальный список магических функций. Удачи с типами и константами!
Чтобы узнать о процедурах и функциях, войдите в системный блок и найдите комментарий:
{ Procedures and functions that need compiler magic }
Ниже, вероятно, приведен довольно полный список. Просто удалите начальное подчеркивание из каждого имени подпрограммы.
Для ключевых слов список в разделе Основы Delphi:
в основном являются «магией компилятора», не декларируемой ни в одном модуле.
Для констант краткий список включает: MaxInt, MaxLongInt, Nil и Pi.
И, как сказал Кен, вы можете найти большинство типов рядом с верх системного блока.
Список типов и согласований также не является официальным, но может быть выведен из источников 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
.Некоторые из внутренне определенных типов можно найти немного ниже в System.pas (около 90 строки в версии, поставляемой с Delphi 2010 Update 4). Их легко найти с помощью поиска по "встроенным типам"; есть список {$EXTERNALSYM} объявлений для C++Builder, где можно найти такие вещи, как String, AnsiString и т.д.
Что касается процедур и функций, то я нигде не знаю ни одного списка. Аллен Бауэр или Барри Келли, возможно, найдут это и смогут помочь.
. Лучшим вариантом перечня готовых изделий является Системная документация . В нем перечислены многие типы и функции, а также имеется отдельная ссылка на список констант , хотя этот список короче, чем я мог ожидать. Однако список не совсем магический. Например, в TInterfacedObject
нет ничего особенного, но он исходит от системного блока, так что он есть в списке.
На самом деле невозможно получить список всех магических объявлений компилятора. Они магические, потому что они не могут быть объявлены. Вы не можете получить декларацию для функции High
, потому что она работает с типами, которые еще даже не изобретены (т.е. с любым типом перечисления). И вы не можете объявить Writeln
, потому что он принимает произвольное количество параметров и поддерживает синтаксис, не разрешенный нигде на языке.
То, что вы можете сделать , это иметь список идентификаторов. Это идентификаторы, к которым компилятор знает, что нужно обращаться специально, если они разрешаются на вещи, обозначенные как принадлежащие системной единице, но которые мы все еще можем использовать для того, чтобы делать собственные объявления где-нибудь еще в программе. При желании можно объявить собственную функцию Writeln
. В вашем вопросе упоминается string
, но это зарезервированное слово; вы не можете объявить свои собственные вещи, называемые string
. Так что, хотя оно определенно особенное, я не думаю, что оно особенное в том смысле, что Integer
и Assert
являются особенными.