通过"."或"^"访问Delphi记录字段

6

我发现了 Delphi 语言中的一些东西,这是我之前没有注意到的。考虑一个简单的记录和指向该记录的指针:

TRecord = record
     value : double;
end;
PTRecord = ^TRecord;

现在声明一个类型为PTRecord的变量:
var x : PTRecord;

并且创建一些空间:

x := new (PTRecord);

我注意到我可以使用'.'符号和'^.'符号来访问值字段。因此,以下两行代码似乎在操作上是等效的,编译器不会报错,运行时也没有问题:

x.value := 4.5;
x^.value := 2.3;

我本以为'^.'是正确的且唯一的访问值的方法?我的问题是,使用更简单的点符号表示法是否可以,如果不使用指针间接操作符'^.'是否会遇到麻烦?也许这是众所周知的行为,但这是我第一次遇到。

4个回答

9

不写插入符号是完全可行且安全的。当然,逻辑上需要插入符号,但由于表达式x.value本身没有有意义的解释,编译器会假定你实际上是想要使用 x^.value。这个功能是所谓的“扩展语法”的一部分。您可以在文档中了解更多信息。


有趣,我不知道还有扩展语法。谢谢提供链接。 - rhody
它最初是为对象引入的,然后也扩展到记录。 - Arioch 'The

4

当应用 扩展语法 (默认情况下)时,您可以在引用指针时省略插入符号。


4
Delphi已经支持这种语法近20年了。当你使用“.”运算符时,编译器会隐式地应用“^”运算符。两种风格都是正确的。由于不存在情况使得有无“^”会影响后续“.”运算符的解释,因此程序不会做错事情。
尽管这种行为受到“扩展语法”选项的控制,但是没有人会禁用该选项。您可以放心地在所有上下文中使用它。它还控制隐式的“Result”变量的可用性以及字符指针与数组语法的兼容方式。

1
这被称为结构类型的隐式指针解引用,继承自Delphi 1。这种语言扩展旨在通过成员运算符(.)访问类的成员(类是结构化类型,实例也是隐式指针),而不需要显式解引用运算符(^)。
您可以放心地在所有Delphi编译器中使用此扩展。为了获得更大的灵活性,您可以使用$IFOPT X+条件指令来测试是否存在此扩展。

那个解释听起来很有吸引力,但是在X模式下,.运算符仍然适用于类。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接