我认为最简单的展示问题的方式是通过一个例子。代码:
PROGRAM CONSTANTSTRING(OUTPUT);
CONST
C_MaxLength = 30;
VAR
small_string : VARYING[5] OF CHAR VALUE 'alpha';
PROCEDURE LocalProc(
localstring : VARYING[C_MaxLength] of CHAR
);
BEGIN
writeln('localstring length: ', localstring.LENGTH);
writeln('localstring size: ', SIZE(localstring.BODY));
writeln('C_MaxLength: ', C_MaxLength);
END;
BEGIN
writeln('small_string length: ', small_string.LENGTH);
writeln('small_string size: ', SIZE(small_string.BODY));
writeln('C_MaxLength: ', C_MaxLength);
LocalProc(small_string);
END.
编译:
>pascal /version
HP Pascal I64 V6.1-116 on OpenVMS I64 V8.4
>pascal constantstringinit
>link constantstringinit
>run constantstringinit
输出结果如下:
small_string length: 5
small_string size: 5
C_MaxLength: 30
localstring length: 5
localstring size: 5
C_MaxLength: 5
正如您所看到的,C_MaxLength
的值在LocalProc
过程内部发生了本地更改。这很奇怪,因为它被声明为常量。
常量的新值仅适用于LocalProc
过程的范围内。在调用LocalProc
之后运行的主代码将使用常量的原始值。
起初,我认为这是编译器的错误,但我推断出这个编译器已经存在了足够长的时间,这样的问题应该已经被检测到并且已经修复或记录下来。但是,我找不到任何相关的文档。 VARYING
是HP扩展,这意味着我无法与其他Pascal实现进行比较。
有没有高手知道这里发生了什么?