【问题标题】:What is the Delphi equivalent to C++ reference parameters?Delphi 等价于 C++ 参考参数是什么?
【发布时间】:2023-03-22 12:15:01
【问题描述】:

如何在 Delphi 中编写int &a

比如C++里是void ABC(int &a, int &b),但是我不知道怎么用Delphi写。

【问题讨论】:

    标签: c++ delphi


    【解决方案1】:

    这是 C++ 中的引用参数。在 Delphi 中对应于 var parameter

    procedure ABC(var a: Integer; var b: Integer);
    

    文档说:

    大多数参数要么是值参数(默认),要么是变量(var)参数。值参数通过值传递,而变量参数通过引用传递。

    【讨论】:

      【解决方案2】:
      void ABC(int &a, int &b)
      

      会变成

      procedure ABC(var a: Integer; var b: Integer);
      

      var 关键字表示您希望通过引用而不是值来传递值。

      【讨论】:

      • procedure ABC(var a, b: Integer); 看起来更简单。
      【解决方案3】:

      还有procedure ABC(out a: Integer; out b: Integer); 虽然它不完全是 var-parameters,但它们也是按引用传递的,旨在将值传递出去。根据您移植的代码的语义,您可以根据具体情况选择varout

      【讨论】:

      • Delphi out 参数的值类型如Integer 的实现方式与var 完全相同。它比较蹩脚。但是 C++ 代码不像out。所以我不知道你为什么提到它。还有const等等等等。
      • @DavidHeffernan Inc(pointer)Inc(integer) 也实现相同,但这并不意味着它在语义上是相同的。我们不知道 topicstarter 代码的语义意图,也不知道额外的编译器控制是否会对他有所帮助。 out 是经常被忽视的功能,学习它并没有什么坏处。
      • 我认为在 Delphi 中实现 out 经常使其成为错误功能。对比一下C#,感叹。
      • 语义上out 表示在过程中忽略了引用参数的输入值。对于托管类型,outvar 相比意味着开销,因为编译器无法忽略由于内置引用计数而导致的托管值,并在过程之外插入额外的代码使 out 托管值无效。我认为没有任何理由在本机 Delphi 代码中使用 out。语言中引入了out 以支持COM,应该在那里使用。
      • @Serg 这实际上是一个糟糕的总结。 out 有很多价值。它说您不能将值传递给函数。遗憾的是,它只对非托管类型有所不同。
      【解决方案4】:

      正如其他人指出的那样,等效的 Delphi 声明是 procedure ABC(var a, b: Integer);除非您的意图是声明 Delphi 代码可以调用的外部 C/C++ 实现的函数,在这种情况下,您必须考虑 C/C++ 函数的调用约定。没有指定调用约定的 Delphi 函数声明,如上所示,使用 Delphi 的 register 调用约定(在 C++Builder 中称为 __fastcall)。您显示的 C/C++ 声明未指定调用约定,因此使用 C/C++ 编译器的默认调用约定,在大多数设置中为 __cdecl,在这种情况下,等效的 Delphi 声明将变为:procedure ABC(var a, b: Integer); cdecl;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多