다음을 통해 공유


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)사용해야 합니다. 이 클래스(일반적으로 CComObject, CComAggObject 또는 CComPolyObject)는 프로젝트에 대한 vtable 포인터를 초기화하므로 프로젝트에서 가장 파생된 클래스와 함께 사용하면 declspec(novtable) 안 됩니다.

를 사용하는 declspec(novtable)개체의 생성자에서 가상 함수를 호출해서는 안 됩니다. 이러한 호출을 FinalConstruct 메서드로 이동해야 합니다.

한정자를 사용해야 declspec(novtable) 하는지 확실하지 않은 경우 클래스 정의에서 ATL_NO_VTABLE 매크로를 제거하거나 전역적으로 지정하여 사용하지 않도록 설정할 수 있습니다.

#define _ATL_DISABLE_NO_VTABLE

다른 모든 ATL 헤더 파일이 포함되기 전에 pch.h (Visual Studio 2017 및 이전 버전의 stdafx.h )에 있습니다.

참고 항목

ATL 프로젝트 마법사
Visual Studio의 C++ 프로젝트 형식
ATL 및 C 런타임 코드를 사용한 프로그래밍
ATL COM 개체 기본 사항
novtable
기본 ATL 프로젝트 구성