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

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

参照

関連項目

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

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

novtable

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

概念

Visual C++ プロジェクトの種類

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

その他の技術情報

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