我如何定义类型化常量并在函数参数中使用它
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()
时需要 Char
,DEFC
文字被视为 Unicode 字符,#98
(或 [=18= ]2c
如果 DEFC = ','
).
在第二次调用中,fun2()
需要一个 AnsiChar
,DEFC
常量被视为 AnsiChar,#
(或 c
如果 DEFC = ','
).
IOW,字符文字是上下文敏感的,如上所述。
作为旁注,令人担忧的是第二次调用没有发出编译器警告。
当我定义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()
时需要 Char
,DEFC
文字被视为 Unicode 字符,#98
(或 [=18= ]2c
如果 DEFC = ','
).
在第二次调用中,fun2()
需要一个 AnsiChar
,DEFC
常量被视为 AnsiChar,#
(或 c
如果 DEFC = ','
).
IOW,字符文字是上下文敏感的,如上所述。
作为旁注,令人担忧的是第二次调用没有发出编译器警告。