6

Delphi 允许 3 个版本的Copy函数:

function CopyTest(const S: string): string;
begin
  Result:= Copy(S, 1, 5);
  Result:= Copy(S, 1);
//  Result:= Copy(S);   //  not allowed for strings, allowed for dyn arrays
end;

FreePascal 似乎只编译第一个(3-arg)版本;对于其他人,我有编译时错误

Error: Wrong number of parameters specified for call to "$fpc_ansistr_copy"

我是否缺少某些 FPC 编译器开关或CopyFree Pascal 中没有重载?

4

2 回答 2

6

“复制”节点生成器代码是FPC 源的inline_copy功能。pinline.pas仅对动态数组变体 1 和 3 有效(生成代码以将第二个和第三个参数的 -1 传递给fpc_dynarray_copy变体 3)。对于所有其他情况(ansi 字符串、宽字符串、unicode 字符串、char(*) 和短字符串),需要 3 个参数(编译器在不检查参数的情况下生成对复制函数之一的调用(例如fpc_ansistr_copyin ),因为被调用的函数具有astrings.pas没有重载或默认参数,需要完全匹配的参数)。不涉及任何开关/指令。

(*)这个有点奇怪,它返回一个它自己或''的短字符串。

于 2012-09-22T14:27:37.600 回答
4

据我所知,Free Pascal 支持默认值参数,所以不需要重载函数。您可以编写新Copy功能,例如...

function Copy(const S: string; From: integer = 1; Count: integer = MaxInt): string;
begin
//There is no need to check the string length
//      if Count > Length(S) then
//        Count := Length(S);
        result := system.Copy(S, From, Count);
end;
于 2012-09-22T09:05:40.973 回答