ATL Projesinde Derleyici İyileştirmesi Belirtme

Varsayılan olarak, ATL Denetim Sihirbazı aşağıdaki gibi ATL_NO_VTABLE makroyla yeni sınıflar oluşturur:

class ATL_NO_VTABLE CProjName
{
...
};

ATL daha sonra _ATL_NO_VTABLE aşağıdaki gibi tanımlar:

#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif

_ATL_DISABLE_NO_VTABLE tanımlamazsanız, ATL_NO_VTABLE makro olarak declspec(novtable)genişletir. Bir sınıf bildiriminde kullanmak declspec(novtable), vtable işaretçisinin sınıf oluşturucusunda ve yıkıcısında başlatılmasını engeller. Projenizi oluşturduğunuzda bağlayıcı, vtable'ı ve vtable'ın işaret ettiği tüm işlevleri ortadan kaldırır.

yalnızca doğrudan creatable olmayan temel sınıflarla ATL_NO_VTABLE ve sonuç olarak declspec(novtable)kullanmanız gerekir. Bu sınıf (genellikle CComObject, CComAggObject veya CComPolyObject) projeniz için vtable işaretçisini başlattığından, projenizdeki en türetilmiş sınıfla kullanmamalısınızdeclspec(novtable).

kullanan declspec(novtable)herhangi bir nesnenin oluşturucusundan sanal işlevleri çağırmamalısınız. Bu çağrıları FinalConstruct yöntemine taşımanız gerekir.

Değiştiriciyi declspec(novtable) kullanmanız gerekip gerekmediğinden emin değilseniz, ATL_NO_VTABLE makroyu herhangi bir sınıf tanımından kaldırabilir veya belirterek genel olarak devre dışı bırakabilirsiniz

#define _ATL_DISABLE_NO_VTABLE

pch.h'de (Visual Studio 2017 ve önceki sürümlerde stdafx.h), diğer tüm ATL üst bilgi dosyaları eklenmeden önce.

Ayrıca bkz.

ATL Projesi Sihirbazı
Visual Studio'da C++ proje türleri
ATL ve C Çalışma Zamanı Koduyla Programlama
ATL COM Nesnelerinin Temelleri
novtable
Varsayılan ATL Projesi Yapılandırmaları