#pragma explicit_rtti
Pragma 指令の概要:インデックス への移動
構文 (「擬似文法」参照)
#pragma explicit_rtti [VISIBILITY-CLAUSE] VISIBILITY-CLAUSE := methods | properties | fields (VISIBILITY-EXPR) VISIBILITY-EXPR := [__published], [public], [protected], [private]
説明
#pragma explicit_rtti を使用すると、Delphi 形式のクラスやレコードに対して生成される RTTI の量を制御することができます。 特定の可視性(public、protected など)のメンバの種類(メソッド、フィールドなど)に対して RTTI を生成するかを明示的に指定できます。
#pragma explicit_rtti を指定すると、その指定は、別の #pragma explicit_rtti を指定して設定を変更するまで、ファイル内の残りの部分でその後に見つかったすべてのクラス メンバ宣言に適用されます。
メンバの種類(メソッド、フィールド、プロパティ)はどの順で指定しても構いません。 指定したメンバの種類それぞれに対する引数は、以下を任意に組み合わせてコンマで区切ったリストでなければなりません:
- __published
- public
- protected
- private
次のようにリストが空の場合には:
#pragma explicit_rtti methods()
その種類のメンバはどれも公開されません。 指定されていないメンバの種類(上記の例ではプロパティとフィールドが指定されていません)に関しては、現在の設定が引き続き使われます。
デフォルト設定
デフォルト設定は、宣言されていない場合、ユーザーが #pragma explicit_rtti を宣言、または、delphirtti や -borland-xrtti を使用しない限り、公開メンバーに対してのみ rtti を生成します。
以下は、#pragma explicit_rtti が宣言された場合のデフォルト設定です:
#pragma explicit_rtti methods (__published, public) properties (__published, public) fields(__published, public, protected, private)
次の表は、この設定を表しています:
| メンバーの可視性 メンバーの種類 |
__published | public | protected | private |
| メソッド | ||||
| プロパティ | ||||
| フィールド |
ユーザーがメンバーの種類を省略して
#pragma explicit_rtti を宣言した場合、省略されたメンバーの種類には、上記のデフォルト値が適用されます。次の例のように、メンバ リストをプリプロセッサ マクロとして定義することができます:
#define VIS_ANY __published, public, protected, private
#define VIS_NONE
#pragma explicit_rtti methods(VIS_ANY) properties(VIS_NONE)
LiveBinding での #pragma explicit_rtti の使用
LiveBinding では RTTI(実行時型情報)を使用します。これは、Delphi で記述されたクラスや型に対して Delphi コンパイラにより生成されます。 C++ アプリケーションでは、Delphi で記述されたクラスや型のみ使用している場合は、#pragma explicit_rtti を使用する必要はありません。 TForm、TButton、TMemo などの標準的な VCL クラスまたは FMX クラスがすべてそれに該当します。 これらの VCL(または FMX)クラスおよび型は Delphi で記述されており、それらには、Delphi コンパイラにより生成された RTTI が既に組み込まれています。
- C++ で記述した Delphi に似たクラスや型を使用する C++ アプリケーションで LiveBinding を使用する場合は、
#pragma explicit_rtti methods()指令を使用する必要があります。 - Delphi で記述したクラスや型(VCL や FMX のクラスおよび型など)が含まれる C++ アプリケーションで LiveBinding を使用する場合は、
#pragma explicit_rtti methods()指令を使用しないでください。