【发布时间】:2023-03-22 12:15:01
【问题描述】:
如何在 Delphi 中编写int &a?
比如C++里是void ABC(int &a, int &b),但是我不知道怎么用Delphi写。
【问题讨论】:
如何在 Delphi 中编写int &a?
比如C++里是void ABC(int &a, int &b),但是我不知道怎么用Delphi写。
【问题讨论】:
这是 C++ 中的引用参数。在 Delphi 中对应于 var parameter。
procedure ABC(var a: Integer; var b: Integer);
文档说:
大多数参数要么是值参数(默认),要么是变量(var)参数。值参数通过值传递,而变量参数通过引用传递。
【讨论】:
void ABC(int &a, int &b)
会变成
procedure ABC(var a: Integer; var b: Integer);
var 关键字表示您希望通过引用而不是值来传递值。
【讨论】:
procedure ABC(var a, b: Integer); 看起来更简单。
还有procedure ABC(out a: Integer; out b: Integer);
虽然它不完全是 var-parameters,但它们也是按引用传递的,旨在将值传递出去。根据您移植的代码的语义,您可以根据具体情况选择var 或out。
【讨论】:
out 参数的值类型如Integer 的实现方式与var 完全相同。它比较蹩脚。但是 C++ 代码不像out。所以我不知道你为什么提到它。还有const等等等等。
Inc(pointer) 和 Inc(integer) 也实现相同,但这并不意味着它在语义上是相同的。我们不知道 topicstarter 代码的语义意图,也不知道额外的编译器控制是否会对他有所帮助。 out 是经常被忽视的功能,学习它并没有什么坏处。
out 经常使其成为错误功能。对比一下C#,感叹。
out 表示在过程中忽略了引用参数的输入值。对于托管类型,out 与 var 相比意味着开销,因为编译器无法忽略由于内置引用计数而导致的托管值,并在过程之外插入额外的代码使 out 托管值无效。我认为没有任何理由在本机 Delphi 代码中使用 out。语言中引入了out 以支持COM,应该在那里使用。
out 有很多价值。它说您不能将值传递给函数。遗憾的是,它只对非托管类型有所不同。
正如其他人指出的那样,等效的 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;
【讨论】: