WEAKLINKRTTI 指令(Delphi)
Delphi コンパイラ指令のリスト:インデックス への移動
種類 |
スイッチ |
構文 |
{$WEAKLINKRTTI ON} または {$WEAKLINKRTTI OFF} |
デフォルト |
{$WEAKLINKRTTI OFF} |
スコープ |
ローカル |
説明
通常、拡張 RTTI を使ってアクセスしたり呼び出すことのできるメソッドはすべて、コンパイルしてバイナリに含めなければなりません。 次の例を見てください。
var LContext: TRttiContext; LType: TRttiType; begin { 新しい RTTI コンテキストを作成 } LContext := TRttiContext.Create(); { 指定された TSomeClass クラスの TRttiType を取得 } LType := LContext.GetType(TSomeClass); { クラス内の SomeMethod というメソッドを呼び出す } LType.GetMethod('SomeMethod').Invoke(['FirstParameter', 2]); end;
この例では、メソッド SomeMethod が動的に呼び出されます。 SomeMethod に対するリンク時の参照が存在しないため、通常のリンク処理ではこのメソッドはバイナリに含められず、その結果、RTTI を使用するコードではメソッドが存在しないために呼び出しに失敗します。 この例では、TSomeClass が拡張 RTTI を持っているため、リンカは(直接に参照されていないものも含め)すべてのメソッドをバイナリに組み込みます。
ただし、すべてのメソッドをバイナリに組み込むのが望ましくない場合があります。 たいていは、実行時にメソッドを探して呼び出す RTTI 対応のコードが存在しないからです。 {$WEAKLINKRTTI ON} を使用すると、すべてのメソッドをバイナリに組み込むというデフォルトの動作を抑制することができます。 $WEAKLINKRTTI 指令は、リンクだけに影響します。 ユニットのコンパイルには影響しません。 $RTTI 指令の設定を変えて元のユニットを再コンパイルすることなしに、最終的な実行可能ファイル内にどれだけの RTTI を生成するかを制御するには、この指令を使うしかありません。