【问题标题】:How to pass const pointer to function?如何将 const 指针传递给函数?
【发布时间】:2015-10-14 13:14:45
【问题描述】:

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

【问题讨论】:

    标签: delphi delphi-xe8


    【解决方案1】:

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

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

    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);
    

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

    【讨论】:

    • 你问的是 Delphi 还是 C++?
    • 显然是关于德尔福的。但这应该就像在 C++ 中一样工作。没想到居然没有。
    • 语言完全不同,并且具有完全不同的编译/链接模型。
    • 重载通常会增加复杂性和额外的代码重复。
    • 我的内联经验是它有效。往往很差的是优化器的性能,它经常难以在内联后应用优化。在这种情况下,无需进行优化,因此内联将满足您的需求。无论如何,我们现在已经远离最初的问题了。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2021-03-09
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多