如何将const指针传递给函数?

时间:2015-10-14 13:14:45

标签: delphi delphi-xe8

如何在函数参数中使用默认常量指针? nil有效,但常规指针不起作用。

program Project1;

type
  TFoo = function(const A, B): Integer;

function FooA(const A, B): Integer; inline;
begin
  WriteLn('FooA');
end;

function FooB(const A, B): Integer; inline;
begin
  WriteLn('FooB');
end;

procedure Something(const Foo: TFoo = @FooA); // Constant expression expected
begin

end;

begin
  Something(FooB);
end.

2 个答案:

答案 0 :(得分:5)

默认参数由编译器评估。因此,它们必须是常量表达式。并且函数的地址在编译时是未知的,因此不是常量表达式。因此错误信息。

了解编译器如何实现默认参数很有帮助。假设你有这样的函数:

procedure foo(bar: Integer = 666);

现在假设在程序中的某个其他位置调用此函数并省略参数,如下所示:

foo();

编译器通过替换默认参数来转换该调用:

foo(666);

然后编译。因为单元是完整编译的,所以默认参数必须是常量表达式。

因此,您无法为您的函数提供默认参数,这根本不可能。相反,你可以使用方法重载来实现同样的目的。

procedure Something(const Foo: TFoo); overload;
begin
  // do something with Foo
end;

procedure Something(); overload; inline;
begin
  Something(FooA);
end;

使用内联强制编译器翻译

Something();

进入

Something(FooA);

这正是您尝试使用默认参数实现的目的。

答案 1 :(得分:2)

你不能这样做。 您可以使用重载方法来传递默认值:

procedure Something(const Foo: TFoo); overload;
begin

end;

procedure Something; overload;
begin
  Something(FooA);
end;