XE7中的Str会产生奇怪的警告

时间:2015-01-30 22:07:08

标签: string delphi delphi-xe7

为什么这段代码:

  w: word;
  s: String;
begin
  str(w, s);

在XE7中生成此警告:

[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string'

汤姆

1 个答案:

答案 0 :(得分:5)

System.Str是一个内在的功能,可以追溯到一个再见的时代。 documentation说明了这一点:

  

procedure Str(const X [:Width [:Decimals]]; var S:String);

     

...

     

注释:但是,在使用此过程时,编译器可能会发出警告:W1057来自'%s'的隐式字符串。到了'%s' (DELPHI)。

     

如果不需要具有预定义最小长度的字符串,请尝试使用IntToStr函数。

由于这是一种内在的,因此可能会有额外的事情发生。在幕后,内部函数通过调用RTL支持函数来实现,该函数产生ShortString。然后编译器魔术将其转换为string。并警告你隐含的转换。编译器魔术转换

Str(w, s);

s := _Str0Long(w);

_Str0Long的位置:

function _Str0Long(val: Longint): _ShortStr;
begin
  Result := _StrLong(val, 0);
end;

由于_Str0Long返回ShortString,因此当编译器分配给您的变量ShortString时,编译器必须生成代码以执行从strings的隐式转换。 }。当然,你看到W1057是很自然的。

底线是Str仅存在以保持与传统Pascal ShortString代码的兼容性。新代码不应该调用Str。您应该执行文档所说的内容并致电IntToStr

s := IntToStr(w);

或者也许:

s := w.ToString;