当我定义typed constant
无法在函数参数的默认值中使用它时,例如:
const
DEFC :Char = ',';
function fun(delimiter :char=DEFC);
运行时,此代码编译器显示此错误:
[dcc32 Error] : E2026 Constant expression expected
如果没有定义这种类型,编译器将类型设置为AnsiChar
,这对我的代码不好,我怎样才能使用这种方式或者说可以说编译器使用Char
而不使用{ {1}}用于字符常量?
答案 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()
需要Char
,DEFC
字面值被视为Unicode字符#$2098
(或$002c
如果DEFC = ','
)。
在第二次通话中,fun2()
需要AnsiChar
,DEFC
const被视为AnsiChar,#$98
(或$2c
if { {1}})。
IOW,字符文字是上下文敏感的,如上所述。
作为旁注,令人担心的是没有为第二次呼叫发出编译警告。
答案 1 :(得分:0)
当您向 const 添加数据类型时,它不再是 const 而是变量,并且编译器告诉您的是什么。从const中删除类型并编译它。
像这样:
const
DEFC = ',';
function fun(delimiter: Char = DEFC) : Integer;
begin
end;