Pascal的任何方言是否允许可变数量的参数?

时间:2009-09-22 12:21:37

标签: language-features pascal

这是程序员的问题。

多年前,我遇到了一种Pascal方言,通过某种扩展方式允许可变数量的参数。

有没有人知道Pascal的当前方言允许可变数量的参数?

鉴于Pascal并不像以前那样流行,如果答案是否定的,我不会感到惊讶。

BTW, 更正确,不是吗,说参数的可变数量,而不是参数

5 个答案:

答案 0 :(得分:6)

没有。答案是基于我使用的Pascal方言;其他人可能会有所不同。

原因是Pascal按顺序将参数压入堆栈帧,因此所有参数都是通过堆栈指针的固定偏移量访问的。相比之下,C以相反的顺序推送参数,因此定义的参数处于固定偏移量,您可以通过指针算法访问“额外”参数。我会尝试一些ASCII艺术:

        Pascal                  C

                                ---------------------
                                |     extra arg     |
        ---------------------   ---------------------
        |     1st param     |   |     3rd param     |
        ---------------------   ---------------------
        |     2nd param     |   |     2nd param     |
        ---------------------   ---------------------
SP ->   |     3rd param     |   |     1st param     |
        ---------------------   ---------------------

至于参数与参数:当我学习它时,函数(方法)定义其参数,调用者传递参数。我相信,这个定义来自Fortran手册,因此应该让您了解我的年龄: - )

答案 1 :(得分:2)

您可以使用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]);

答案 2 :(得分:1)

GNU-Pascal(基于gcc)afaik映射1:1到C支持。使用函数(arg:pchar; ...)就像语法

Delphi / Free Pascal有“const数组”支持,这是一个类型安全版本,还有一个用于C接口的varargs指令(D6或D7 +)

答案 3 :(得分:0)

你可能正在考虑一个可用于Turbo Pascal的库,他们有这样的黑客攻击。我的语法对于对象来说有点生疏,并且从它下降。

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终止。

答案 4 :(得分:0)

是的!

使用 params 关键字:

procedure write(params args: array of Object);
begin
  {...}
end;