如何从单元内部引用外部功能

时间:2014-09-17 14:54:28

标签: pascal freepascal

我有两个文件。第一个a.pas包含:

uses b;

function f(x: integer): integer;
begin
    f := x+1;
end;

begin
    writeln(g(10));
end.

文件b.pas包含:

unit b;

interface
function g(x: integer): integer;

implementation
function g(x: integer): integer;
begin
    g := f(x)*2;
end;

end.

是否有可能以某种方式引用f中定义的函数a.pas?我考虑过像这样使用forward关键字:(b.pas

unit b;

interface
function g(x: integer): integer;

implementation
function f(x: integer): integer; forward;
function g(x: integer): integer;
begin
    g := f(x)*2;
end;

end.

但它不起作用。它提供了一个未解决的"转发声明"错误。

我还考虑过使用external关键字,但为了使用外部f函数,b.pas要求a.pas已经编译(但是{{1} }}还需要a.pas

执行此操作的唯一方法似乎是将b.pas(接口和实现)移动到新的f文件,并修改helper.pas,如下所示:

b.pas

我不希望没有unit b; interface function g(x: integer): integer; implementation uses helper; function g(x: integer): integer; begin g := f(x)*2; end; end. 文件。但也许这不可能吗?

1 个答案:

答案 0 :(得分:1)

使用当前的源代码布局是不可能的。如果你不想把a.pas作为一个单位(为什么?),你可以重写函数g以获得一个函数参数:

{$ifdef FPC}
  {$mode delphi}
{$endif}

type
  tintfunc = function(x: integer): integer;

function g(x: integer; f: tintfunc): integer;
begin
  g := 2*f(x);
end;

function f(x: integer): integer;
begin
  f := x+1;
end; 

begin
  writeln(g(3,f));
end.

还有其他方法(包括全局函数指针),但函数参数是IMO最实用的方法。