Macros de opciones del compilador
Estas macros controlan características específicas del compilador.
Macro | Descripción |
---|---|
_ATL_ALL_WARNINGS |
Símbolo que permite errores en los proyectos convertidos desde versiones anteriores de ATL. |
_ATL_APARTMENT_THREADED |
Defina si uno o varios de los objetos usan subprocesamiento de apartamento. |
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS |
Hace que determinados constructores CString sean explícitos, lo que impide cualquier conversión involuntaria. |
_ATL_ENABLE_PTM_WARNING |
Defina esta macro para solicitar la sintaxis estándar de C++. Genera el error del compilador C4867 cuando se usa la sintaxis no estándar para inicializar un puntero a una función miembro. |
_ATL_FREE_THREADED |
Defina si uno o varios de los objetos usan subprocesos libres o neutros. |
_ATL_MODULES |
Permite compilar proyectos ATL con permisivo y usar ATL con módulos de C++. |
_ATL_MULTI_THREADED |
Símbolo que indica que el proyecto tiene objetos marcados como Ambos, Libres o Neutros. La macro _ATL_FREE_THREADED debe usarse en su lugar. |
_ATL_NO_AUTOMATIC_NAMESPACE |
Símbolo que impide el uso predeterminado del espacio en nombres como ATL. |
_ATL_NO_COM_SUPPORT |
Símbolo que impide que el código relacionado con COM se compile con el proyecto. |
ATL_NO_VTABLE |
Símbolo que impide que el puntero de la vtable se inicialice en el constructor y destructor de la clase. |
ATL_NOINLINE |
Símbolo que indica que una función no debe insertarse. |
_ATL_SINGLE_THREADED |
Defina si todos los objetos usan el modelo de subprocesos único. |
_ATL_ALL_WARNINGS
Símbolo que permite errores en los proyectos convertidos desde versiones anteriores de ATL.
#define _ATL_ALL_WARNINGS
Comentarios
Antes de Visual C++ .NET 2002, ATL deshabilitaba muchas advertencias y las dejaba deshabilitadas para que nunca aparecieran en el código de usuario. Específicamente:
La expresión condicional C4127 es constante
C4786 'identifier' : el identificador se ha truncado a caracteres 'numéricos' en la información de depuración
Se ha usado una extensión no estándar C4201: estructura o unión sin nombre
C4103 'filename': usado en #pragma pack para cambiar la alineación
C4291 'declaration': no se ha encontrado un operador de eliminación que coincida; la memoria no se liberará si la inicialización produce una excepción
C4268 'identifier': los datos estáticos o globales 'const' inicializados con el constructor predeterminado que se ha generado por el compilador llenan el objeto con ceros
Código inaccesible C4702
En los proyectos convertidos desde versiones anteriores, estas advertencias siguen deshabilitadas por los encabezados de las bibliotecas.
Para cambiar este comportamiento, agregue la siguiente línea al pch.h
archivo (stdafx.h
en Visual Studio 2017 y versiones anteriores) antes de incluir encabezados de bibliotecas.
#define _ATL_ALL_WARNINGS
Si esto #define
se agrega, los encabezados ATL tienen cuidado de preservar el estado de estas advertencias para que no se deshabiliten globalmente (o si el usuario deshabilita explícitamente las advertencias individuales, para no habilitarlas).
Los nuevos proyectos tienen esto #define
establecido en pch.h (stdafx.h en Visual Studio 2017 y versiones anteriores) de forma predeterminada.
_ATL_APARTMENT_THREADED
Defina si uno o varios de los objetos usan subprocesamiento de apartamento.
_ATL_APARTMENT_THREADED
Comentarios
Especifica el subprocesamiento de apartamento. Para ver otras opciones y una descripción de los modelos de subprocesos disponibles para un objeto ATL, vea Especificar el modelo y las opciones de subprocesamiento del proyecto y Opciones, Asistente para objetos simples ATL.
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS
Hace que determinados constructores CString
sean explícitos, lo que impide cualquier conversión involuntaria.
_ATL_CSTRING_EXPLICIT_CONSTRUCTORS
Comentarios
Cuando se define este constructor, todos los CString
constructores que toman un único parámetro se compilan con la palabra clave explícita, lo que impide conversiones implícitas de argumentos de entrada. Esto significa, por ejemplo, que cuando _UNICODE
se define, si intenta usar una char*
cadena como CString
argumento de constructor, se produce un error del compilador. Use esta macro en situaciones en las que necesite evitar conversiones implícitas entre las cadenas de tipo estrecho y ancho.
Mediante el uso de la _T
macro en todos los argumentos de cadena de constructor, puede definir _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
y evitar errores de compilación independientemente de si _UNICODE
se define.
_ATL_ENABLE_PTM_WARNING
Defina esta macro para forzar el uso de la sintaxis que cumple con el estándar de ANSI C++ para el puntero a las funciones miembro. El uso de esta macro hace que se genere el error del compilador C4867 cuando se usa sintaxis no estándar para inicializar un puntero a una función miembro.
#define _ATL_ENABLE_PTM_WARNING
Comentarios
Las bibliotecas ATL y MFC se han cambiado para que coincidan con el cumplimiento estándar C++ mejorada del compilador de Microsoft C++. Según el estándar ANSI C++, la sintaxis de un puntero a una función miembro de una clase debe ser &CMyClass::MyFunc
.
Cuando _ATL_ENABLE_PTM_WARNING
no se define (el caso predeterminado), ATL/MFC deshabilita el error C4867 en los mapas de macros (en particular los mapas de mensajes) para que el código creado en versiones anteriores pueda seguir compilando como antes. Si define _ATL_ENABLE_PTM_WARNING
, el código debe ajustarse al estándar de C++.
Sin embargo, el formulario no estándar ha quedado en desuso. Debe mover el código existente a la sintaxis estándar de C++. Por ejemplo, el código siguiente:
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
ON_COMMAND(ID_MYCOMMAND, OnMycommand)
END_MESSAGE_MAP()
Se debe cambiar a:
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
ON_COMMAND(ID_MYCOMMAND, &CMFCListViewDoc::OnMycommand)
END_MESSAGE_MAP()
Para las macros de mapa, agregue el carácter "&" y . No debe volver a agregar el carácter en el código.
_ATL_FREE_THREADED
Defina si uno o varios de los objetos usan subprocesos libres o neutros.
_ATL_FREE_THREADED
Comentarios
Especifica el subproceso libre. El subprocesamiento libre es equivalente a un modelo de apartamento multiproceso. Consulte Especificar el modelo de subprocesos del proyecto para otras opciones de subproceso y Opciones, Asistente para objetos simples ATL para obtener una descripción de los modelos de subprocesos disponibles para un objeto ATL.
_ATL_MODULES
Permite compilar proyectos ATL con permissive-
y usar ATL con módulos de C++.
_ATL_MODULES
_ATL_MULTI_THREADED
Símbolo que indica que el proyecto tiene objetos marcados como Ambos, Libres o Neutros.
_ATL_MULTI_THREADED
Comentarios
Si se define este símbolo, ATL extrae código que sincronizará correctamente el acceso a los datos globales. En su lugar, el nuevo código debe usar la macro _ATL_FREE_THREADED
equivalente.
_ATL_NO_AUTOMATIC_NAMESPACE
Símbolo que impide el uso predeterminado del espacio en nombres como ATL.
_ATL_NO_AUTOMATIC_NAMESPACE
Comentarios
Si este símbolo no está definido, incluido atlbase.h
el using namespace ATL
rendimiento de forma predeterminada, lo que puede provocar conflictos de nomenclatura. Para impedir esto, defina este símbolo.
_ATL_NO_COM_SUPPORT
Símbolo que impide que el código relacionado con COM se compile con el proyecto.
_ATL_NO_COM_SUPPORT
ATL_NO_VTABLE
Símbolo que impide que el puntero de la vtable se inicialice en el constructor y destructor de la clase.
ATL_NO_VTABLE
Comentarios
Si se impide que el puntero de la vtable se inicialice en el constructor y el destructor de la clase, el enlazador puede eliminar la vtable y todas las funciones a las que apunta. Se expande a __declspec(novtable)
.
Ejemplo
class ATL_NO_VTABLE CMyClass2 :
ATL_NOINLINE
Símbolo que indica que una función no debe insertarse.
ATL_NOINLINE inline
myfunction()
{
...
}
Parámetros
myfunction
Función que no se debe insertar.
Comentarios
Use este símbolo si desea asegurarse de que el compilador no inserte una función, aunque se deba declarar como insertada para que se pueda colocar en un archivo de encabezado. Se expande a __declspec(noinline)
.
_ATL_SINGLE_THREADED
Defina si todos los objetos usan el modelo de subprocesos único
_ATL_SINGLE_THREADED
Comentarios
Especifica que el objeto siempre se ejecuta en el subproceso COM principal. Consulte Especificar el modelo de subprocesos del proyecto para otras opciones de subproceso y Opciones, Asistente para objetos simples ATL para obtener una descripción de los modelos de subprocesos disponibles para un objeto ATL.