第2章 常量(Constants)
和Turbo Pascal一样,Free Pascal也支持普通常量和类型常量.
2.1 普通常量(Ordinary constants)
普通常量的声明是用标识名后面跟上一个等号"=",然后再跟上一个由数字,字符,布尔或者枚举值适当合法组合的可选的表达式.如下的语法图显示了构造一个合法的普通常量声明.
_________________________________________________________________________________________________________Constant declaration
___________________________________________________________________
编译器必须能够在运行时就计算出表达式的值.意思是绝大多数的运行时库中的函数不能被用在构造常量声明.而操作符比如 +, -, *, /, not, and, or, div, mod, ord, chr, sizeof, pi, int, trunc, round, frac, odd 可以被使用.要获取表达式的更多信息,请看第9章,第334页.
常量只有如下的类型能够被声明:有序类型Ordinal types, 实数类型Real types, 字符Char, 以及字符串 String.如下是正确的常量声明:
Const
e = 2.7182818; { 实数类型常量Real type constant. }
a = 2; { 有序(Integer)类型常量Ordinal (Integer) type constant. }
c = '4'; { 字符常量Character type constant. }
s = 'This is a constant string'; {字符串常量String type constant.}
s = chr(32)
ls = SizeOf(Longint);
给一个普通常量是不被允许的. 所以,以上声明后,如下语句将会导致一个编译错误:
s := 'some other string';
对于字符串常量,字符串的类型取决于一些编译开关.如果声明了一个特殊的类型,那么得使用类型常量,在下一章节将会介绍.
在版本1.9以前,Free Pascal不能正确的支持64位常量.而到版本1.9及以后,可以定义64位常量.
2.2 类型常量(Typed constants
有时需要特定类型的常量,例如复数结构的常量(在后面会定义).它们的定义相对简单.
_________________________________________________________________________________________________________Typed constant declaration 

___________________________________________________________________
和普通常量不同,类型常量的值可以在运行时赋值.这是一个老来自Turbo Pascal的老观点,现在已经改成对初始化变量(initialized variables)的支持:要获得详细的描述,请查看4.4章节,第184页.
对于类型常量的赋值用由{$J}指令控制的:这是可以被关闭的,但默认是打开的(为了与Turbo Pascal兼容).初始化变量(initialized variables)是一直允许的.
备注:需要强调的是类型常量是在程序开始时自动初始化的.对于局部的(local)类型常量和初始化变量(initialized variables)也一样.局部类型常量也会在程序开始时初始化,如果它们的值被以前的调用所改变,它们将会保留改变的值,即它们并不是在每一次函数调用时进行初始化的.
2.3 资源字符串(Resource strings)
一种特殊的常量声明块是资源字符串块(the Resourcestring block).资源字符串的声明比较类似时字符串常量的声明:资源字符串的行为像字符串常量,但是他们可以被objpas单元中的一系列特殊例程进行本地化.资源字符串的声明块只允许在Delphi或者Objfpc模式下使用.
如下是一个关于资源字符串的定义的例子.
Resourcestring
FileMenu = '&File...';
EditMenu = '&Edit...';
所有在resourcestring节定义的字符串常量被储存在特殊的表里.这些表里的字符串因为一些objpas单元提供的特殊机制能在运行时被操作.
在语义上,这些字符串的行为像普通常量,不能向它们赋值(除非通过objpas单元里提供的特殊机制).当然,它们能和普通的字符串常量一样使用在赋值或表达式里.resourcestring节的主要用途是提供一个简单的国际化方法.
更多关于资源字符串的主题可以在程序员向导<Programmer's Guide>中找到,以及objbas的单元参考.
备注:注意一个由给定的表达式定义的资源字符串在表达式中的部分值改变时它不会发生改变.
resourcestring
Part1 = 'First part of a long string.';
Part2 = 'Second part of a long string.';
Sentence = Part1+' '+Part2;
如果本地化例程翻译了Part1和Part2,而Sentence常量不会自动得进行翻译:它在资源字符串表中有独立的入口,所以必须被独立的翻译.上面的结构简单的说Sentence的初始值等于Part1+' '+Part2.
备注:同样的,当在一个数组常量中使用资源字符串时,数组中只有资源字符串的初始值被使用:当个别常量被翻译后,数组中的元素依然保留它们的原始值.
resourcestring
Yes = 'Yes.';
No = 'No.';
Var
YesNo : Array[Boolean] of string = (No,Yes);
B : Boolean;
begin
Writeln(YesNo[B]);
end.
这将会打印 'Yes.' 或 'No.' 取决于B的值, 而不管常量Yes和No是否已经被一些本地化机制翻译了.
浙公网安备 33010602011771号