尽管Delphi引用了什么
结构化类型可以包含其他结构化类型 一个类型可以有无限级别的结构
值得注意的例外是结构化类型常量
不能包含任何级别的文件类型值
我发现我不能使用记录常量作为相同类型的数组常量的元素.
type
MyRecord = record MyField: Integer end;
const
Typical: array[0..1] of MyRecord = ((MyField: 0), (MyField: 1));
{ now I tried to achieve more clarity by declaring a specific constant }
Zero: MyRecord = (MyField: 0);
{ and compiler refused to accept that }
Bad: array[0..1] of MyRecord = (Zero, (MyField: 1)); { E2029 '(' expected but identifier 'Zero' found }
Run Code Online (Sandbox Code Playgroud)
我用几个Borland编译器测试了这个代码,它们都表现出相同的行为.UPD:FPC也是如此,但不适用于GPC(!).
这里发生了什么?我是否更正问题标题中的"嵌套结构类型的嵌套常量不受支持"结论?对问题的任何更多分析?
看来这是不可能的,其根本原因是ZeroRec不是真正的常量,它更像是一个初始化的静态变量.
如果指定了{$ WRITEABLECONST ON},则可以进行简单的更改.即使使用$ WRITEABLECONST OFF,也可以通过某些创意类型转换(在XE2中测试)进行更改:
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
MyRecord = record MyField: Integer end;
PMyRecord = ^MyRecord;
const
Typical: array[0..1] of MyRecord = ((MyField: 0), (MyField: 1));
{ now I tried to achieve more clarity by declaring a specific constant }
ZeroRec: MyRecord = (MyField: 0);
{ and compiler refused to accept that }
// Bad: array[0..1] of MyRecord = ((MyField: Zero), (MyField: 1)); { E2029 '(' expected but identifier 'Zero' found }
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
WriteLn(ZeroRec.MyField);
PMyRecord(@ZeroRec)^.MyField := 2;
WriteLn(ZeroRec.MyField);
readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
这将输出
0
2
简单类型的行为也很明显,
Zero = 0;
ZeroRec: MyRecord = (MyField: Zero);
Run Code Online (Sandbox Code Playgroud)
然而,按预期编译
Zero : Integer = 0;
ZeroRec: MyRecord = (MyField: Zero);
Run Code Online (Sandbox Code Playgroud)
给出[DCC错误] Project3.dpr(19):E2026期望的常量表达式
归档时间: |
|
查看次数: |
466 次 |
最近记录: |