Share via


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 헤더 파일이 포함되기 전에, 모든 클래스 정의에서 ATL_NO_VTABLE 매크로를 제거하거나

#define _ATL_DISABLE_NO_VTABLE

ATL_NO_VTABLE 매크로를 전역적으로 비활성화하도록 stdafx.h에서 지정할 수 있습니다.

참고 항목

작업

응용 프로그램 마법사를 사용하여 프로젝트 만들기

참조

ATL 프로젝트 마법사

Fundamentals of ATL COM Objects

novtable

기본 ATL 프로젝트 구성

개념

Visual C++ 프로젝트

Programming with ATL and C Run-Time Code