The Delphi Bug List

Entry No.
115
コンパイラ - コンパイル出来ない
全く同じ宣言の(ポインタ)変数同士に代入互換性がない
1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 4.03 5.0 5.01 6.0 6.01 6.02 Kylix 1.0
Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Unknown
解説
Reported by Damien Rame; checked by Stefan Hoffmeister
Steve Teixeira corrected us:
これはバグではなく特徴です。このことは Object Pascal 言語ガイドのデータ型の章の "型の互換性と同一性" に、「「二つのポインタ型は、両方の型が同じ型を指す型付きポインタであり、かつ {$T+} コンパイラ指令が有効である場合にのみ互換性がある」として書かれています。
マニュアルのこの部分を忘れたり読み飛ばしていたりすると、以下のような現象に驚いてしまうでしょう。
以下のコードはコンパイルできません。
procedure TForm1.FormCreate(Sender: TObject);
var
  myptr : ^Byte;
  head : ^Byte;
begin
  myptr := head;
end;
Delphi 3(5.53)では代入している行で、互換性のない型と報告してきます。変数宣言を以下のように書き換えると、
var
  myptr, head : ^Byte;
この問題を回避できます。この問題は、一般的な型にだけではなく、全ての型(例 TMyRecord = record ... end; )に当てはまります。
解決策 / 回避方法
共有のポインタ型を定義すること(または上記の特別な場合なら PByte を使うこと)は常に良いアイデアで、この問題を回避できます。
もうひとつの候補は、そのユニットに {$T+} コンパイル指令を追加することです。
Latest update of this entry: before April 1998
本家 The Delphi Bug List のエントリーはこちら
The Delphi Bug List 日本語訳 へ