嵌套结构化类型的嵌套常量是不受支持的?

OnT*_*Fly 5 delphi pascal

尽管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(!).

问题(S)

这里发生了什么?我是否更正问题标题中的"嵌套结构类型的嵌套常量不受支持"结论?对问题的任何更多分析?

Ger*_*oll 5

看来这是不可能的,其根本原因是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期望的常量表达式