如何在函数参数中使用默认常量指针? 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.
答案 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;