Где я могу найти всесторонний список 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.     }

Очевидно, это нигде не около всестороннего списка. Кто-либо знает, где я мог найти полный список?

Править: Ответы, которые я имею до сих пор, кажется, немного перепутаны относительно того, что я ищу. Я пытаюсь найти список встроенных констант, типов, процедур и функций, которые компилятор распознает, но не объявляется ни в какой единице. В качестве примера можно привести Высокий (), Writeln (), Утверждают (), строка, и т.д.

9
задан Mason Wheeler 23 December 2009 в 17:21
поделиться

5 ответов

это официальный список магических функций. Удачи с типами и константами!

9
ответ дан 4 December 2019 в 10:04
поделиться

Чтобы узнать о процедурах и функциях, войдите в системный блок и найдите комментарий:

{ Procedures and functions that need compiler magic }

Ниже, вероятно, приведен довольно полный список. Просто удалите начальное подчеркивание из каждого имени подпрограммы.

Для ключевых слов список в разделе Основы Delphi:

в основном являются «магией компилятора», не декларируемой ни в одном модуле.

Для констант краткий список включает: MaxInt, MaxLongInt, Nil и Pi.

И, как сказал Кен, вы можете найти большинство типов рядом с верх системного блока.

0
ответ дан 4 December 2019 в 10:04
поделиться

Список типов и согласований также не является официальным, но может быть выведен из источников 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

.
2
ответ дан 4 December 2019 в 10:04
поделиться

Некоторые из внутренне определенных типов можно найти немного ниже в System.pas (около 90 строки в версии, поставляемой с Delphi 2010 Update 4). Их легко найти с помощью поиска по "встроенным типам"; есть список {$EXTERNALSYM} объявлений для C++Builder, где можно найти такие вещи, как String, AnsiString и т.д.

Что касается процедур и функций, то я нигде не знаю ни одного списка. Аллен Бауэр или Барри Келли, возможно, найдут это и смогут помочь.

.
3
ответ дан 4 December 2019 в 10:04
поделиться

Лучшим вариантом перечня готовых изделий является Системная документация . В нем перечислены многие типы и функции, а также имеется отдельная ссылка на список констант , хотя этот список короче, чем я мог ожидать. Однако список не совсем магический. Например, в TInterfacedObject нет ничего особенного, но он исходит от системного блока, так что он есть в списке.

На самом деле невозможно получить список всех магических объявлений компилятора. Они магические, потому что они не могут быть объявлены. Вы не можете получить декларацию для функции High, потому что она работает с типами, которые еще даже не изобретены (т.е. с любым типом перечисления). И вы не можете объявить Writeln, потому что он принимает произвольное количество параметров и поддерживает синтаксис, не разрешенный нигде на языке.

То, что вы можете сделать , это иметь список идентификаторов. Это идентификаторы, к которым компилятор знает, что нужно обращаться специально, если они разрешаются на вещи, обозначенные как принадлежащие системной единице, но которые мы все еще можем использовать для того, чтобы делать собственные объявления где-нибудь еще в программе. При желании можно объявить собственную функцию Writeln. В вашем вопросе упоминается string, но это зарезервированное слово; вы не можете объявить свои собственные вещи, называемые string. Так что, хотя оно определенно особенное, я не думаю, что оно особенное в том смысле, что Integer и Assert являются особенными.

.
1
ответ дан 4 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: