我有两个文件。第一个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.
文件。但也许这不可能吗?
答案 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最实用的方法。