次の方法で共有


ATL プロジェクトのコンパイラ最適化の指定

更新 : 2007 年 11 月

ATL コントロール ウィザードは、既定では ATL_NO_VTABLE マクロを使用して新しいクラスを生成します。次に例を示します。

class ATL_NO_VTABLE CProjName
{
   ...
};

ATL は _ATL_NO_VTABLE を以下のように定義します。

#ifdef _ATL_DISABLE_NO_VTABLE
   #define ATL_NO_VTABLE
#else
   #define ATL_NO_VTABLE __declspec(novtable)
#endif

_ATL_DISABLE_NO_VTABLE を定義しない場合、ATL_NO_VTABLE マクロは declspec(novtable) に展開されます。クラス宣言で declspec(novtable) を使用すると、クラスのコンストラクタやデストラクタで vtable ポインタが初期化されません。プロジェクトのビルド時に、vtable および vtable が指すすべての関数はリンカによって削除されます。

ATL_NO_VTABLE および declspec(novtable) は、直接作成できない基本クラスだけで使用します。プロジェクトの最派生クラス (通常は CComObjectCComAggObject、または CComPolyObject) はプロジェクトの vtable ポインタを初期化するため、プロジェクトの最派生クラスでは declspec(novtable) を使用しないでください。

declspec(novtable) を使用するオブジェクトのコンストラクタからは、仮想関数を呼び出しません。これらの呼び出しは、FinalConstruct メソッドに移動してください。

declspec(novtable) 修飾子を使用するかどうかを判断できない場合は、クラス定義から ATL_NO_VTABLE マクロを削除するか、またはほかのすべての ATL ヘッダー ファイルをインクルードする前に、stdafx.h で次のように指定してマクロをグローバルに無効にできます。

#define _ATL_DISABLE_NO_VTABLE

参照

処理手順

アプリケーション ウィザードを使用したプロジェクトの作成

概念

Visual C++ プロジェクト

ATL および C ランタイム コードによるプログラミング

参照

ATL プロジェクト ウィザード

ATL COM オブジェクトの基本事項

novtable

ATL プロジェクトの既定の構成