Константы
Константа – именованный элемент программы, который не меняет свое значение. Перед употреблением должна быть объявлена в разделе констант const. Определены два типа констант: истинные и типизированные.
Истинная константа
Она объявляется со значением. Ее тип неизвестен, поэтому ее значение в программе менять нельзя:
const ConstName=<Значение>;
Типизированная константа объявляется с типом и значением. В сущности это инициализированная переменная. Ее значение в программе менять можно.
const ConstName:NameType=<Значение>;
Значением типизированной константы могут быть:
- Конкретные данные (число, строка).
- Выражение.
- Для указателей Nil или адрес локальной переменной.
- Файловый тип и тип Variant запрещены.
Как и Turbo Pascal, FPC поддерживает простые и типизированные константы.
Реализация объявлений простых констант одинакова во FPC, Turbo Pascal и Delphi.
Компилятору необходимо вычислять значение выражения в объявлении константы во время компиляции. Это значит, что большинство функций библиотеки времени выполнения нельзя использовать в объявлении констант. Тем не менее, можно использовать такие операции и функции, как +, -, *, /, not, and, or, div, mod, ord, chr, sizeof, pi, int, trunc, round, frac, odd. Можно объявить константы только следующих типов: порядковые, вещественные, Char и String. Правильные объявления констант:
Const
r = 2.7182818; // Вещественная константа
i = 2; // Порядковая (целая) константа
c = ’4′; // Символьная константа
s = ‘Это строковая константа’; // Константа типа String
cc = chr(32);
ls= SizeOf(Longint);
Простой константе не разрешается присваивать значение. Так, если даны вышеприведенные объявления, то следующая операция присваивания приведет к ошибке компилятора:
s:= ‘другая строка’;
Типизированные константы
Они служат для инициализации переменных. В отличие от простых констант, во время выполнения программы им можно присваивать значения. Они отличаются от обычных переменных тем, что автоматически получают значение в начале работы программы, а обычные переменные должны инициализироваться явным образом в ходе ее работы. Пусть дано объявление:
Const
S: String = ‘Это типизированная константа’;
Тогда
S:= ‘Result: ‘+Func;
является допустимым присваиванием, где Func – это функция, возвращающая значение типа String. Типизированные константы часто используют для инициализации массивов и записей. Для массивов начальные значения должны быть отделены друг от друга запятой и указаны в круглых скобках. Количество значений должно в точности совпадать с количеством элементов массива в объявлении типа. Например,
Const
tt: array [1..3] of string[20] = (‘ikke’, ‘gij’, ‘hij’);
ti: array [1..3] of Longint = (1,2,3);
Что касается константных записей, то все элементы записи в круглых скобках, отделенные друг от друга запятыми, должны быть указаны в формате Поле. Значение, например,
Type
Point = record
X,Y: Real
end;
Const
Origin: Point = (X:0.0; Y:0.0);
Порядок полей в константной записи должен совпадать с порядком полей в объявлении типа, иначе компилятор выдаст ошибку.
Замечание. Следует подчеркнуть, что типизированные константы получают начальные значения в начале работы программы. Это верно и для локальных типизированных констант. Локальные типизированные константы также инициализируются в начале работы программы. Если значение локальной типизированной константы менялось в предыдущем вызове функции, то это её изменённое значение сохраняется, то есть локальные типизированные константы не инициализируются при каждом вызове функции.
Ресурсные строки
Особый вид части объявления констант – это часть Resourcestring. Эта часть подобна секции Const, но поддерживает только константы типа строка и доступна только в режимах Delphi или objfpc.
Следующий пример представляет определение resourcestring:
Resourcestring
FileMenu = ‘&File…’;
EditMenu = ‘&Edit…’;
Все константы строк определены в секции resourcestring и хранятся в специальных таблицах, позволяющих манипулировать значениями строк в реальном режиме с некоторыми особыми механизмами.
Семантически строки подобны константам. Им не могут быть присвоены значения, за исключением присвоения через специальный механизм в модуле objpas. Однако они могут быть использованы в присвоениях или выражениях, как обычные константы. Главное применение секции resourcestring – для обеспечения лёгкой интернационализации. Можно не меняя имени строки изменить ее содержания без перепрограммирования исходника.