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

时间:2015-10-10 08:27:51

标签: delphi const delphi-xe7

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

const
  DEFC   :Char  = ',';

  function fun(delimiter :char=DEFC);

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

[dcc32 Error] : E2026 Constant expression expected

如果没有定义这种类型,编译器将类型设置为AnsiChar,这对我的代码不好,我怎样才能使用这种方式或者说可以说编译器使用Char而不使用{ {1}}用于字符常量?

2 个答案:

答案 0 :(得分:1)

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

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

考虑这两个问题(作为替代方案):

const
  DEFC = ',';     // tool-tip shows System.AnsiChar
  DEFC = #$0298;  // 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,$0298   // $002c if DEFC = ','
0060503A E8A5FFFFFF       call fun1
...
MainFormU.pas.234: ShowMessage(inttostr(fun2));
0060504F B098             mov al,$98     // $2c if DEFC = ','
00605051 E8A6FFFFFF       call fun2
...

在第一次通话中,fun1()需要CharDEFC字面值被视为Unicode字符#$2098(或$002c如果DEFC = ',')。

在第二次通话中,fun2()需要AnsiCharDEFC const被视为AnsiChar,#$98(或$2c if { {1}})。

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

作为旁注,令人担心的是没有为第二次呼叫发出编译警告。

答案 1 :(得分:0)

当您向 const 添加数据类型时,它不再是 const 而是变量,并且编译器告诉您的是什么。从const中删除类型并编译它。

像这样:

const
  DEFC = ',';

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

end;