如何在 Delphi 12 中启用严格的 Int32/Int64 类型兼容性检查

欢迎加入全网最大Delphi 技术交流群 682628230

在将大量类从 32 位的 Integer 迁移到 64 位的 Int64 时,希望编译器能够在传递 32 位的 Integer 给显式定义为 Int64 的过程时抛出异常。由于 Int32 与 Int64 兼容,默认情况下不会报错。

解决方案

通过方法重载标记弃用的方式,可以实现对参数类型的严格检查。具体步骤如下:

  1. 1. 方法重载
    为每个整数类型(如 Int8Int16Int32Int64 等)创建重载方法。
  2. 2. 标记弃用
    将不希望使用的重载方法标记为 deprecated,这样在调用时会触发编译器警告(W1000)。
  3. 3. 示例代码
    以下是一个示例,展示了如何通过重载方法检测不同的整数类型:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure Test(I: Int8); overload; deprecated;
    procedure Test(I: Int16); overload; deprecated;
    procedure Test(I: Int32); overload; deprecated;
    procedure Test(I: Int64); overload;
  public
  end;

procedure TForm1.Test(I: Int8);
begin
  ShowMessage('8 位整数');
end;

procedure TForm1.Test(I: Int16);
begin
  ShowMessage('16 位整数');
end;

procedure TForm1.Test(I: Int32);
begin
  ShowMessage('32 位整数');
end;

procedure TForm1.Test(I: Int64);
begin
  ShowMessage('64 位整数');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ShI: Int8;
  SmI: Int16;
  I: Int32;
  I64: Int64;
  NatI: NativeInt;
begin
  Test(ShI);  // 触发 8 位整数警告
  Test(SmI);  // 触发 16 位整数警告
  Test(I);    // 触发 32 位整数警告
  Test(I64);  // 正常调用 64 位整数方法
  Test(NatI); // 根据平台(32/64 位)调用对应方法
end;

 

注意事项

  • • 如果传递表达式或常量,可能会导致编译器错误“ambiguous overload”(重载歧义)。
  • • 迁移完成后,可以移除标记为 deprecated 的方法。

总结

通过方法重载和标记弃用,可以在迁移过程中严格检查 Int32 和 Int64 的类型兼容性,避免潜在的范围检查错误。

 

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享