共用方式為


指定 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),只有無法直接建立的基類。 您不得與專案中衍生最多的類別搭配使用declspec(novtable),因為此類別 (通常是 CComObjectCComAggObject 或 CComPolyObject) 會初始化專案的 vtable 指標。

您不得從任何使用 declspec(novtable)之物件的建構函式呼叫虛擬函式。 您應該將這些呼叫移至 FinalConstruct 方法。

如果您不確定是否應該使用 declspec(novtable) 修飾詞,您可以從任何類別定義中移除ATL_NO_VTABLE巨集,或者可以透過指定來全域停用巨集

#define _ATL_DISABLE_NO_VTABLE

pch.h 中 (Visual Studio 2017 和更早版本中的 stdafx.h ),在包含所有其他 ATL 頭檔之前。

另請參閱

ATL 專案精靈
Visual Studio 中的 C++ 專案類型
使用 ATL 和 C 執行階段程式碼進行程式設計
ATL COM 物件的基本概念
novtable
預設 ATL 專案組態