【问题标题】:Are constant record's unlisted elements initialized with default values in Delphi?常量记录的未列出元素是否在 Delphi 中使用默认值初始化?
【发布时间】:2018-07-20 02:41:57
【问题描述】:

让我们假设这些声明:

type
  TMyRec = record
    Name    : String;
    Age     : Integer;
    Married : Boolean;
  end;

  TMyRecArray = Array[0..3] of TMyRec;

const
  RecArray: TMyRecArray = ((Name: 'John' ; Age: 25; Married: False),
                           (Name: 'Wendy'; Age: 32                ),
                           (Name: 'Nick' ;          Married: True ),
                           (               Age: 19; Married: False));

最后三个数组行中未列出的记录元素是否使用默认值自动初始化?或者它们是否(可以)包含随机数据?

Embarcadero's docwiki 没有就此发表任何官方声明。

【问题讨论】:

  • 答案是肯定的,但遗憾的是这是无证的:docwiki.embarcadero.com/RADStudio/Tokyo/en/…
  • 没有错误。尝试时似乎正在初始化值,但这并不能证明任何事情,我只能幸运。此外,局部变量通常包含似乎是默认值(数字为 0,布尔值为 False),但我们确定它们根本没有被初始化。
  • @DavidHeffernan 是的,我在询问之前阅读了该页面;)
  • 在问题中包含指向它的链接会很高兴
  • @DavidHeffernan 完成

标签: delphi initialization constants record


【解决方案1】:

你的默认值的记录数组常量声明可以声明为:

const
  RecArray: TMyRecArray = ((),
                           (),
                           (),
                           ());

所以是的,在常量声明中省略记录字段将产生默认值。


不幸的是,这种行为没有记录在案。您将不得不使用调试器进行验证。 Delphi 的前身 Turbo Pascal 的工作方式几乎相同。您必须包含所有字段的值,直到最后一个非默认字段。

【讨论】:

  • 谢谢陆路。这是在某处记录的吗? (不幸的是,不在记录常量官方文档中)。
  • 不,没有记录
  • 所以我们可以说这是仅通过对已编译代码进行逆向工程的实际行为?
  • 没错。您需要查看写入可执行文件以表示常量的数据。在调试器下检查。
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多