2012-01-03 2 views
13

Объявление переменных в Delphi привело меня к рассмотрению вещи, которую я не могу понять.Зарезервированные слова и идентификаторы Delphi

Вопрос заключается в следующем: объявляя строки, можно заметить, что string является зарезервированным словом, а при объявлении других типов данных, скажем целых, спецификатор типа данных не является зарезервированным словом, а идентификатором (т.е. Integer, столица I говорит так).

Фактически, Delphi позволяет перейти к определению Integer, которое вы обнаружите, оно содержится в системном блоке, но оно является только представительным, поскольку есть комментарий, в котором утверждается, что некоторые константы (например, True), идентификаторы (например Integer), функции и процедуры непосредственно встроены в компилятор.

Я не могу понять причины этого выбора.

Помогло ли кто-нибудь?


Небольшое пояснение разницы между string и Integer типов. Следующий код

type 
    Integer = Char; 

var 
    I: Integer; 

begin 
    I:= 'A'; 
    ShowMessage(I); 
end; 

правильно и работает, как и ожидалось, в то время как следующая строка

type 
    string = Integer; 

дает время компиляции ошибки.

+4

Delphi - * не * с учетом регистра. –

+2

Да, я знал. Хотя Delphi не чувствителен к регистру, считается хорошей практикой программирования для использования в соответствии с соглашением InfixCaps. Так же, как и я. –

+5

+1, так как это интересный вопрос, хотя ответа не может быть «определенного». Мое личное предположение, однако, состоит в том, что тип 'string' окружен настолько малой вычислительной маской, что он был продвинут на« зарезервированное слово », а не на« встроенный тип Ctrl + clickable »... –

ответ

7

Насколько я знаю, string - это зарезервированное слово с времен Turbo Pascal. Поэтому причина держать его таким образом должна быть совместима.

Pascal -> Turbo Pascal -> Object Pascal -> Delphi.

Проверьте эти ресурсы.

+2

Первоначально, я полагаю, 'string' был классифицирован Borland как один из так называемых« структурированных »типов, а также' array' и 'record', потому что у него были дополнительные синтаксические элементы (квадратные скобки, спецификатор максимальной длины). Поэтому он должен был стать зарезервированным словом, которое должно анализироваться особым образом, в отличие от простых типов, которые были просто идентификаторами, такими как «Integer» или «Real». –

+0

@AndriyM У него все еще есть дополнительные синтаксические элементы. –

+1

@DavidHeffernan: Да, когда используется в «старом виде», он автоматически считается «ShortString», я знаю. Моя точка зрения, изначально это был * строго * структурный тип. Теперь он чаще всего используется как простой тип строки (указатель) (синтаксически), и, вероятно, он должен оставаться зарезервированным словом из-за поддержки более старого использования. –

4

string должен быть зарезервированным словом, потому что она не используется исключительно для обозначения типа System.[Ansi|Unicode]String. Если string были простым псевдонимом для некоторого внутреннего типа компилятора, то string[20] больше не работал. Это не проблема для Integer, потому что Integer всегда означает не более, чем «тип System.Integer».

+1

Я сомневаюсь, что строка * должна * быть зарезервированным словом; Я бы предпочел, чтобы разработчику компилятора turbo pascal было проще реализовать «string» в качестве зарезервированного слова. – kludg

+0

Ну да. Вы * можете * создать парсер, который разрешает любой тип 'type [length]' и выдает ошибку, если 'type' является чем-то другим, кроме' string', или если 'string' не разрешается' System.UnicodeString'. Но почему бы вам? – hvd

Смежные вопросы