代码之家  ›  专栏  ›  技术社区  ›  gammatester

system.str的警告

  •  3
  • gammatester  · 技术社区  · 7 年前

    如果用delphi10.2.3编译以下程序

    {$apptype console}
    var
      spi: string;
    begin
      str(pi:10:5, spi);
      writeln(spi);
    end.
    

    tst.pas(5) Warning: W1057 Implicit string cast from 'ShortString' to 'string'

    虽然 spi 声明为string,并且system.str的原型也有一个字符串(根据 http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Str 以及联机帮助):

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

    功能 :

    function _Str2Ext(val: Extended; Width, Precision: Integer): _ShortStr;

    显然,编译器在这里发挥了某种魔力,但是

    第一次尝试

    str(pi:10:5, ShortString(spi));

    将抛出错误消息:

    tst.pas(5) Error: E2064 Left side cannot be assigned to

    左侧 .

    1 回复  |  直到 7 年前
        1
  •  4
  •   David Dubois    7 年前

    编译器确实在做一些 魔术 “在幕后。

    STR 是图书馆的老套路。从涡轮帕斯卡时代就开始了。当它被创建时,唯一的字符串是 ShortString S当然,在那些日子里,他们只是被叫来 string S

    该例程不使用标准语法来调用Delphi中的过程或函数,因此编译器执行“魔术”将其内部转换为标准函数调用,并且该函数返回 短字符串

    为了避免出现警告,可以使用实际的 短字符串 ,然后将其显式转换为 一串 .

    var
      aShortString : ShortString;
      aString      : string;
    begin
      str ( pi:10:5, aShortString );
      aString := string(aShortString);
      writeln ( aString );
    

    或者你可以不用 STR公司 使用更现代的方法:

    uses
      System.SysUtils;
    var
      S : string;
    begin
      S := Format ( '%10.5f', [ pi ] );
      writeln ( S );
    

    STR公司