45

私は Delphi 2010 でプロジェクトを開始し、XE に移行しましたが、現在は XE2 に移行しようとしています。XE2 (Update 4 Hotfix 1) でコンパイルした後、単体テストが AV で失敗し始めました。いくつかのデバッグの後、次のコードが正しくコンパイルされていないことが明らかになりました。

program ForwardDeclaration;

{$APPTYPE CONSOLE}

uses
    System.SysUtils;

type
    TEntityBase = class(TObject)
    protected
        FModel: Integer;
    public
        constructor Create(const AModel: Integer);
    end;

    TEntity<TKey> = class(TEntityBase)
    end;

    TMyEntity2 = class;

    TMyEntity1 = class(TEntity<Integer>)
        FData: Integer;
    end;

    TMyEntity2 = class(TMyEntity1)
    end;

constructor TEntityBase.Create(const AModel: Integer);
begin
    inherited Create;
    FModel := AModel;
end;

var
    MyEntity: TMyEntity1;
begin
    try
        Writeln(TEntityBase.ClassName, ': ', TEntityBase.InstanceSize, ' bytes');
        Writeln(TMyEntity1.ClassName, ': ', TMyEntity1.InstanceSize, ' bytes');
        MyEntity := TMyEntity1.Create(100);
        Assert(MyEntity.FData = 0);
    except
        on E: Exception do Writeln(E.ClassName, ': ', E.Message);
    end;
end.

プログラム出力:

TEntityBase: 12 bytes
TMyEntity1: 12 bytes <-- Must be 16 bytes!
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr, line 41)

コンパイラ オプションをチューニングすることで問題を解決できますか?

この問題が他の誰かで繰り返されるかどうか?

PS QC107110

4

1 に答える 1

4

コンパイラ オプションをチューニングすることで問題を解決できますか?

いいえ、チューニングによってエラーを修正することはできません。これはコンパイラの (非常に具体的な) バグです。

[誰か教えてくれませんか] この問題は他の誰かにも繰り返されますか?

コードを再現できますが、XE2 update 4 でのみです。

XE3 では確認できませんでした (そのバージョンはありません)。XE4で修正されています(コメントによる)。

したがって、コードを機能させる唯一の方法は次のとおりです。

a. 不要な前方宣言を削除します。
b. 別のバージョンの Delphi を使用してください。

于 2013-09-11T17:09:43.380 に答える