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+} コンパイル指令を追加することです。
|
|