【问题标题】:Delphi - W1048 Unsafe typecast of 'string' to 'TFormatSettings'Delphi - W1048“字符串”到“TFormatSettings”的不安全类型转换
【发布时间】:2012-10-21 20:59:35
【问题描述】:

我正在将一个旧项目移植到 Delphi XE,并在下面的代码中收到此警告。

function RemoveThousandSeperator(Text: String) : String;
Var P : Integer;
begin
  if length(Text) > 3 then begin
    p := Pos(FormatSettings.ThousandSeparator,Text);
   while p >0 do begin
      Delete(Text,p,1);
      p := Pos(FormatSettings.ThousandSeparator,Text);
    end;
  end;
  result := Text;
end;

甚至 FormatSettings.ThousandSeparator 也是 char 类型。

LE:我在问是否有人可以告诉我为什么会出现此警告。代码旧了,会重新制作。

LE2 : 为了得到这个警告,需要在 Delphi 编译器提示和警告中将所有警告设置为 true

LE3:如果有人需要它 - {$WARN UNSAFE_CAST OFF} 会发出警告。

LE4:对于那些认为警告难以相信的人的警告截图

【问题讨论】:

  • 你应该发布完整的功能,你提供的片段还不够。
  • 我不明白 -1。谁能给我解释一下?
  • 我刚刚签入 XE2,这段代码没有产生警告。
  • @JensMühlenhoff - 我放了整个例程。无论如何,警告与整个例程无关。
  • 看起来像是 XE 特有的。 XE2 在没有警告的情况下编译它就好了。附言StringReplace 听起来像是更短的代码。

标签: delphi delphi-xe


【解决方案1】:

警告的来源是SysUtils.pasFormatSettings变量的声明:

var
  // Note: Using the global FormatSettings variable corresponds to using the
  // individual global formatting variables and is not thread-safe.
  FormatSettings: TFormatSettings absolute CurrencyString;

将字符串 (CurrencyString) 转换为记录 (TFormatSettings)。

所以产生警告的问题在SysUtils.pas,而不是在你发布的代码中, 尽管警告是在您的代码中生成的。


这是一个测试用例(Delphi XE):

program Project1;

{$APPTYPE CONSOLE}
{$WARN UNSAFE_CAST ON}

type
  TTest = record
    FS: string;
  end;

var
  Str: string;
  Test: TTest absolute Str;

begin
  Str:= 'abc';
  Writeln(Test.FS);   //  W1048 Unsafe typecast of 'string' to 'TTest'
end.

【讨论】:

  • 没有办法导致这个编译器警告。它必须是编译器错误。
  • @DavidHeffernan - 在没有SysUtils.pas 的情况下,这个问题很容易在 Delphi XE 中重现。 Delphi XE是我最后一个Delphi,可以测试最新版本。警告是合乎逻辑的,但出现在错误的位置。
  • 我猜该项目编译 SysUtils.pas(调试 DCU?),这会导致生成警告。
  • @JensMühlenhoff - 不,不需要那样的东西。
  • @DavidHeffernan - absolute 只是一个推迟的类型转换。我不明白你到底不同意什么。
猜你喜欢
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2010-12-06
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多