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

use*_*124 2 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.
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

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

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

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)

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