共用方式為


為 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 指標在類別建構函式 (Constructor) 和解構函式 (Destructor) 中初始化。當您建置專案時,連結器 (Linker) 會排除 vtable 指向的 vtable 和所有函式。

您必須只在不是直接可建的基底函式上使用 ATL_NO_VTABLE 並接著使用 declspec(novtable)。您無法在專案中衍生程度最高的類別上使用 declspec(novtable),因為這個類別 (通常是 CComObjectCComAggObjectCComPolyObject) 會為專案初始化 vtable 指標。

您無法從任何使用 declspec(novtable) 物件之建構函式呼叫 Virtual 函式。您必須將這些呼叫移至 FinalConstruct 方法。

如果不確定是否應使用 declspec(novtable) 修飾詞 (Modifier),您可從任何類別定義移除 ATL_NO_VTABLE 巨集,或是可在 stdafx.h 中指定以下這一行來全域停用它:

#define _ATL_DISABLE_NO_VTABLE

在 stdafx.h 中,必須在包含所有其他 ATL 標頭檔 (Header File) 之前這麼做。

請參閱

工作

使用應用程式精靈建立專案

概念

Visual C++ 專案

Programming with ATL and C Run-Time Code

參考

ATL 專案精靈

Fundamentals of ATL COM Objects

novtable

預設的 ATL 專案組態