#pragma hashome ディレクティブは、#pragma ishome で指定されるホーム・モジュールが指定されたクラスにあることをコンパイラーに通知します。このクラスの仮想関数テーブルであり、ある種のインライン関数とともに、静的には生成されません。代わりに、 #pragma ishome が指定されたクラスのコンパイル単位で外部参照されます。
ここで、
className | 上記の外部参照を必要とするクラスの名前を指定します。className はクラスでなければならず、またこれを定義しておかなければなりません。 |
AllInlines | className 内から、すべてのインライン関数を外部参照する必要があることを指定します。この引き数は大/小文字を区別しません。 |
#pragma hashome と一致しない #pragma ishome がある場合は、警告が出されます。
以下の例では、コード・サンプルをコンパイルすることにより、仮想関数テーブル、およびコンパイル単位 b.o ではなく、a.o のみの S::foo() の定義が生成されます。これにより、アプリケーション用に生成されるコードの量が削減されます。
// a.h struct S { virtual void foo() {} virtual void bar(); }; // a.C #pragma ishome(S) #pragma hashome (S) #include "a.h" int main() { S s; s.foo(); s.bar(); } // b.C #pragma hashome(S) #include "a.h" void S::bar() {}