文件类型默认值的Freepascal过程参数

时间:2016-01-19 18:49:50

标签: freepascal

类方法有一个简单的定义

PROCEDURE  Print  (str : string = ''; VAR  f : text);

这给出了编译器错误

Error: (3185) Default parameter required for "F"

这很奇怪,因为在this page上它说“变量参数不支持默认值”。忽略它,添加默认值:

PROCEDURE  Print  (str : string = ''; VAR  f : text = stderr);

给出编译器错误

Error: (3203) Illegal expression

这里的正确语法是什么(正确的意思是我如何让编译器开心)?

2 个答案:

答案 0 :(得分:4)

一旦参数具有默认值,后面的所有参数也必须具有默认值,这就是你有

的原因
  

错误:(3185)" F"

所需的默认参数

在编译的这一点上,FPC没有检测到,从语法上讲, F 没有默认参数,它只是看到没有默认值。< / p>

你的声明应该是

PROCEDURE  Print  (VAR  f : text; str : string = '');

为了更进一步,让我们采取这个功能:

procedure foo(a: integer = 8; b: integer);

如果你这样称呼它

foo(4);

编译器不知道 4 是否用于 a 而您忘记 b 4 适用于 b 。这就是必须始终将默认参数放在最后的原因。这也是FPC发出以下错误的原因:

  

错误:&#34; B&#34;

需要默认参数

答案 1 :(得分:0)

@Nestedtype解释的补充。

可以使用overloaded方法解决,而无需更改参数顺序,如

PROCEDURE  Print  (str : string; VAR  f : text); overload; // Calls as Print('foo', f);
PROCEDURE  Print  (VAR  f : text); overload; // Calls as Print(f);

并在实施部分中:

PROCEDURE  Print  (str : string; VAR  f : text);
begin
    // Do what you need
end;

PROCEDURE  Print  (VAR  f : text);
begin
    Print('', f); // Here '' is the "default" value
end;