如何在函数参数中使用默认常量指针?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.
Run Code Online (Sandbox Code Playgroud)
默认参数由编译器评估.因此,它们必须是常量表达式.并且函数的地址在编译时是未知的,因此不是常量表达式.因此错误消息.
了解编译器如何实现默认参数很有帮助.假设你有这样的函数:
procedure foo(bar: Integer = 666);
Run Code Online (Sandbox Code Playgroud)
现在假设在程序中的某个其他位置调用此函数并省略参数,如下所示:
foo();
Run Code Online (Sandbox Code Playgroud)
编译器通过替换默认参数来转换该调用:
foo(666);
Run Code Online (Sandbox Code Playgroud)
然后编译.因为单元是完整编译的,所以默认参数必须是常量表达式.
因此,您无法为函数提供默认参数,这根本不可能.相反,您可以使用方法重载来实现相同的功能.
procedure Something(const Foo: TFoo); overload;
begin
// do something with Foo
end;
procedure Something(); overload; inline;
begin
Something(FooA);
end;
Run Code Online (Sandbox Code Playgroud)
内联的使用迫使编译器进行翻译
Something();
Run Code Online (Sandbox Code Playgroud)
成
Something(FooA);
Run Code Online (Sandbox Code Playgroud)
这正是您尝试使用默认参数实现的.