Partilhar via


Especificação da Otimização do Compilador para um Projeto ATL

Observação

A Active Template Library (ATL) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Por defeito, o ATL Control Wizard gera novas classes com a macro ATL_NO_VTABLE, da seguinte forma:

class ATL_NO_VTABLE CProjName
{
...
};

A ATL define então _ATL_NO_VTABLE da seguinte forma:

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

Se não definires _ATL_DISABLE_NO_VTABLE, a macro ATL_NO_VTABLE expande-se para declspec(novtable). Usar declspec(novtable)em uma declaração de classe impede que o ponteiro vtable seja inicializado no construtor e destruidor de classes. Quando constróis o teu projeto, o linker elimina o vtable e todas as funções para as quais o vtable aponta.

Deves usar ATL_NO_VTABLE e, consequentemente declspec(novtable), com apenas classes base que não são diretamente criáveis. Não deve usar declspec(novtable) com a classe mais derivada no seu projeto, porque esta classe (normalmente CComObject, CComAggObject ou CComPolyObject) inicializa o ponteiro vtable do seu projeto.

Não deve chamar funções virtuais a partir do construtor de qualquer objeto que use declspec(novtable). Deves mover essas chamadas para o método FinalConstruct .

Se não tiver a certeza se deve usar o declspec(novtable) modificador, pode remover a macro ATL_NO_VTABLE de qualquer definição de classe, ou pode desativá-la globalmente especificando

#define _ATL_DISABLE_NO_VTABLE

em pch.h (stdafx.h no Visual Studio 2017 e anteriores), antes de todos os outros ficheiros de cabeçalho ATL serem incluídos.

Consulte também

Assistente de projeto ATL
Tipos de projeto C++ no Visual Studio
Programação com ATL e C Run-Time Code
Fundamentos dos ATL COM Objects
Novtable
Configurações padrão do projeto ATL