【问题标题】:Nested constants of nested structured types are unsupported?不支持嵌套结构化类型的嵌套常量?
【发布时间】:2013-04-27 02:51:37
【问题描述】:

尽管 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 }

我用几个 Borland 编译器测试了这段代码,它们都表现出相同的行为。 UPD:FPC 也一样,但 GPC(!) 不一样。

问题

这里发生了什么?我对问题标题中的“不支持嵌套结构化类型的嵌套常量”的结论是否正确?再分析一个问题吗?

【问题讨论】:

    标签: delphi pascal


    【解决方案1】:

    这似乎是不可能的,根本原因是 ZeroRec 并不是真正的常量,它更像是一个初始化的静态变量。

    如果指定了{$WRITEABLECONST ON},则可以对其进行简单更改。即使 $WRITEABLECONST 关闭,它也可以通过一些创造性的类型转换来改变(在 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.
    

    这将输出

    0

    2

    简单类型的行为也很明显,

      Zero = 0;
      ZeroRec: MyRecord = (MyField: Zero);
    

    按预期编译,但是

      Zero : Integer = 0;
      ZeroRec: MyRecord = (MyField: Zero);
    

    给出 [DCC 错误] Project3.dpr(19): E2026 Constant expression expected

    【讨论】:

    • 啊,明白了,这是常量表达式要求的效果。
    【解决方案2】:

    您声明的内容称为Typed Constant。在这种特定情况下,它是Array Constant。文档状态(强调我的):

    要声明一个数组常量,请将数组元素的值括在声明末尾的括号中,用逗号分隔。这些值必须由常量表达式表示。

    编译器对象的代码是您尝试使用类型常量的地方,其中只允许使用常量表达式。

    这是 Delphi 语言中最令人沮丧的领域之一,因为该语言会迫使您重复自己。

    【讨论】:

      猜你喜欢
      • 2019-02-17
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2019-08-11
      • 2020-10-13
      • 2016-07-19
      • 1970-01-01
      • 2011-03-26
      相关资源
      最近更新 更多