指定 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)
,因為此類別 (通常是 CComObject 、 CComAggObject 或 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 專案組態
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應