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

4 回答 4

9

省略插入符号是完全正确和安全的。当然,逻辑需要插入符号,但由于表达式x.value本身没有有意义的解释,编译器会假设您实际上是指x^.value. 此功能是所谓的“扩展语法”的一部分。您可以在文档中阅读有关此内容的信息。

于 2013-05-30T20:01:12.073 回答
4

扩展语法生效时(默认),您可以在引用指针时省略插入符号。

于 2013-05-30T20:01:18.813 回答
4

Delphi 支持这种语法已有近二十年的历史。当您使用.运算符时,编译器将^隐式应用该运算符。两种风格都是正确的。您的程序没有机会做错事,因为在任何情况下存在或不存在^都会影响后续.运算符的解释。

尽管此行为由“扩展语法”选项控制,但没有禁用该选项。您可以放心地依赖它在所有上下文中设置。它还控制隐式Result变量的可用性,以及字符指针与数组语法兼容的方式。

于 2013-05-30T20:01:27.223 回答
1

这称为结构化类型的隐式指针取消引用,并继承自 Delphi 1。此语言扩展旨在仅通过成员运算符 () 访问类的成员(类是结构化类型,实例也是隐式指针).,避免显式取消引用运算符 ( ^) 的要求。

您可以放心地依赖所有 Delphi 编译器中存在的此扩展。为了获得更大的灵活性,您可以使用$IFOPT X+条件指令测试此扩展是否存在。

于 2013-05-30T21:37:13.727 回答