String XE7中的Str生成奇怪的警告

String XE7中的Str生成奇怪的警告,string,delphi,delphi-xe7,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' Tom系统。Str是一种固有的功能,可以追溯到拜根时代。报告说: 过程Str(常量X[:宽度[:小数]];变量S:String) 注意:但是,在使用此过程时,编译器可能会发出警告:W1057

为什么该代码:

  w: word;
  s: String;
begin
  str(w, s);
在XE7中生成此警告:

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

Tom

系统。Str
是一种固有的功能,可以追溯到拜根时代。报告说:

过程Str(常量X[:宽度[:小数]];变量S:String)

注意:但是,在使用此过程时,编译器可能会发出警告:W1057隐式字符串从“%s”转换为“%s”(Delphi)

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

因为这是内在的,所以可能有额外的事情发生。在幕后,内部函数通过调用RTL支持函数来实现,该函数生成
短字符串
。然后,编译器魔术将其转换为
字符串
。并警告您隐式转换。编译器的魔法变换

Str(w, s);
进入

其中
\u Str0Long
为:

function _Str0Long(val: Longint): _ShortStr;
begin
  Result := _StrLong(val, 0);
end;
由于
\u Str0Long
返回一个
短字符串
,因此编译器必须生成代码,以便在赋值给变量
s
时执行从
短字符串
字符串
的隐式转换。当然,你看到W1057是很自然的

总之,
Str
的存在只是为了保持与传统Pascal
ShortString
代码的兼容性。新代码不应调用
Str
。您应该按照文档中的说明进行操作,并调用
IntToStr

s := IntToStr(w);
或许:

s := w.ToString;

从XE2升级到XE7后,我一直在处理的众多编译器警告之一。编译器实际上会生成一个对_StrLong的调用,该调用返回一个短字符串。这当然不是一个答案。@Jerry-这对XE2来说是一样的。@Sertac警告本身,而不是确切的场景。@Jerry,完全一样。将System.Str赋值给ShortString并没有什么新的,这是一种将整数转换为文本而不影响堆内存分配的方法。@LURD True dat。我认为有更好的办法。在任何情况下,这里我们将分配给
string
。但是对于那些性能非常关键的边缘情况,可以使用
Str
来避免堆。David:你的帖子中没有包含“RTFM”,这给了我很大的限制。谢谢你一贯的详尽回答。由于我们正在迁移超过一百万行的代码,因此我在第一阶段采用了“尽可能少的更改”的路线,在调用此命令的几行代码上使用$WARNINGS。(它们实际上是Str(w:3:1,S),因此比我提供的简单示例要多一些…@Tom短期内全局禁用W1057不会有任何影响。长期而言,您可能会以
w.ToString.padlef(3)
s := w.ToString;