【问题标题】:Access Delphi record fields via . or ^通过 访问 Delphi 记录字段。或^
【发布时间】:2013-05-30 19:56:39
【问题描述】:

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

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

现在声明一个 PTRecord 类型的变量:

var x : PTRecord;

并创造一些空间:

x := new (PTRecord);

我注意到我可以同时使用“.”来访问值字段。符号和 '^.'符号。因此,以下两行在操作上似乎是等效的,编译器不会抱怨并且运行时工作正常:

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

我会认为'^。'是获取价值的正确且唯一的方法吗?我的问题是,是否可以使用更简单的点表示法,或者如果我不使用指针间接'^。'会遇到麻烦?也许这是众所周知的行为,但这是我第一次遇到它。

【问题讨论】:

    标签: delphi


    【解决方案1】:

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

    【讨论】:

    • 有趣,我不知道扩展语法。感谢您的链接。
    • 它是为对象引入的,然后也扩展到记录
    【解决方案2】:

    Extended syntax 生效时(默认),您可以在引用指针时省略插入符号。

    【讨论】:

      【解决方案3】:

      Delphi 支持这种语法已经有近二十年的历史了。当您使用. 运算符时,编译器将隐式应用^ 运算符。两种风格都是正确的。您的程序不可能做错事,因为^ 的存在与否不会影响后续. 运算符的解释。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 这个解释听起来很吸引人,但是。运算符仍然适用于 X 模式下的类
        猜你喜欢
        • 1970-01-01
        • 2018-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 2013-01-05
        相关资源
        最近更新 更多