為 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 指標在類別建構函式 (Constructor) 和解構函式 (Destructor) 中初始化。當您建置專案時,連結器 (Linker) 會排除 vtable 指向的 vtable 和所有函式。
您必須只在不是直接可建的基底函式上使用 ATL_NO_VTABLE 並接著使用 declspec(novtable)。您無法在專案中衍生程度最高的類別上使用 declspec(novtable),因為這個類別 (通常是 CComObject、CComAggObject 或 CComPolyObject) 會為專案初始化 vtable 指標。
您無法從任何使用 declspec(novtable) 物件之建構函式呼叫 Virtual 函式。您必須將這些呼叫移至 FinalConstruct 方法。
如果不確定是否應使用 declspec(novtable) 修飾詞 (Modifier),您可從任何類別定義移除 ATL_NO_VTABLE 巨集,或是可在 stdafx.h 中指定以下這一行來全域停用它:
#define _ATL_DISABLE_NO_VTABLE
在 stdafx.h 中,必須在包含所有其他 ATL 標頭檔 (Header File) 之前這麼做。