我如何定义类型化常量并在函数参数中使用它

How can i define typed constant and use it in functions argument

当我定义typed constant时不能在函数参数的默认值中使用它,例如:

const
  DEFC   :Char  = ',';

  function fun(delimiter :char=DEFC);

当 运行 此代码编译器显示此错误时:

[dcc32 Error] : E2026 Constant expression expected

如果未定义此类型,编译器将类型设置为 AnsiChar,这对我的代码不利,我如何使用这种方式或可以说编译器使用 Char 而不是的方式使用 AnsiChar 作为字符常量?

当您将数据类型添加到 const 时,它不再是 const 而是 variable,这就是编译器告诉你的。从您的 const 中删除类型并进行编译。

像这样:

const
  DEFC = ',';

function fun(delimiter: Char = DEFC) : Integer;
begin

end;

您似乎过于依赖工具提示信息。该信息不是由实际编译器生成的,不值得下注。

无论如何,字符和字符串文字是上下文相关的。这意味着编译器(实际代码生成器)将根据文字的使用方式创建适当的代码。

考虑这两个常量(作为替代):

const
  DEFC = ',';     // tool-tip shows System.AnsiChar
  DEFC = #98;  // tool-tip shows System.AnsiChar here too!

这只是表明这里不能依赖工具提示,因为它不知道将在什么上下文中使用 const。

然后考虑下面两个函数:

function fun1(delimiter: Char = DEFC): integer;
begin
  result := ord(delimiter);
end;

function fun2(delimiter: AnsiChar = DEFC): integer;
begin
  result := ord(delimiter);
end;

和以下 OnClick 处理程序,调用这些函数

procedure TMainForm.Button7Click(Sender: TObject);
begin
  ShowMessage(inttostr(fun1));
  ShowMessage(inttostr(fun2));
end;

两次调用编译器生成的代码不同

MainFormU.pas.233: ShowMessage(inttostr(fun1));
00605036 66B89802         mov ax,98   // [=13=]2c if DEFC = ','
0060503A E8A5FFFFFF       call fun1
...
MainFormU.pas.234: ShowMessage(inttostr(fun2));
0060504F B098             mov al,     // c if DEFC = ','
00605051 E8A6FFFFFF       call fun2
...

在第一次调用 fun1() 时需要 CharDEFC 文字被视为 Unicode 字符,#98(或 [=18= ]2c 如果 DEFC = ',').

在第二次调用中,fun2() 需要一个 AnsiCharDEFC 常量被视为 AnsiChar,#(或 c如果 DEFC = ',').

IOW,字符文字是上下文敏感的,如上所述。

作为旁注,令人担忧的是第二次调用没有发出编译器警告。