这是老程序员的问题。
几年前,我遇到了一种 Pascal 方言,它通过某种扩展允许可变数量的参数。
有谁知道当前允许可变数量参数的 Pascal 方言?
鉴于 Pascal 不像以前那样受欢迎,如果答案是否定的,我不会感到惊讶。
顺便说一句,说可变数量的参数而不是参数更正确,不是吗?
这是老程序员的问题。
几年前,我遇到了一种 Pascal 方言,它通过某种扩展允许可变数量的参数。
有谁知道当前允许可变数量参数的 Pascal 方言?
鉴于 Pascal 不像以前那样受欢迎,如果答案是否定的,我不会感到惊讶。
顺便说一句,说可变数量的参数而不是参数更正确,不是吗?
不。答案是基于我使用过的帕斯卡方言;其他人可能会有所不同。
原因是 Pascal 将参数按顺序推送到堆栈帧上,因此所有参数都通过堆栈指针的固定偏移量访问。相比之下,C 以相反的顺序推送参数,因此定义的参数位于固定偏移量,您可以通过指针算术访问“额外”参数。我会尝试一些 ASCII 艺术:
Pascal C
---------------------
| extra arg |
--------------------- ---------------------
| 1st param | | 3rd param |
--------------------- ---------------------
| 2nd param | | 2nd param |
--------------------- ---------------------
SP -> | 3rd param | | 1st param |
--------------------- ---------------------
至于参数与参数:据我所知,函数(方法)定义其参数,调用者传递参数。我相信,这个定义来自 Fortran 手册,所以这应该让您了解我的年龄:-)
您可以在 delphi 中使用可选参数来获得相同的效果:
procedure Proc(const A: Integer; const B: Integer = 15);
Proc(10); // B = 15
Proc(20,30);
或重载方法:
procedure Proc(const A: Integer); overload;
procedure Proc(const A,B: Integer); overload;
Proc(10); // Variant 1
Proc(20,30); // Variant 2
或者您可以使用变量数组作为参数:
procedure Message(const AMessage: string; const AArgs: array of const);
Message('Hello %s', [Name]);
Message('%s %s', [Greeting, Name]);
GNU-Pascal(基于 gcc)afaik 将 1:1 映射到 C 支持。使用函数 something(arg:pchar;...) 之类的语法
Delphi/Free Pascal 支持“const 数组”,这是一个类型安全的版本,以及用于 C 接口(D6 或 D7+)的 varargs 指令
您可能正在考虑一个可用于 Turbo Pascal 的库,他们有这样的 hack。我的语法对于对象和继承它有点生疏。
type
TValue = object;
TInteger = object(TValue)
Value : Integer;
end
TString = object(TValue)
Value : String;
end
TParam = record
Value : TValue;
Param : TParam;
end;
TValue = object;
{ Definition of Function }
function Test (Arg : TParam);
{ Usage }
var
I : TInteger;
S : TString;
Test (TParam (I, TParam (S, nil));
您可以根据需要链接任意数量的参数。最后一个必须以 nil 终止。
是的!
使用params
关键字:
procedure write(params args: array of Object);
begin
{...}
end;