Macros predefinidas
El compilador de Microsoft C/C++ (MSVC) predefinía determinadas macros de preprocesador en función del lenguaje (C o C++), el destino de compilación y las opciones del compilador elegidas.
MSVC admite las macros de preprocesador predefinidas que exigen los estándares C99, C11 y C17 de ANSI/ISO y los estándares C++14, C++17 y C++20 de ISO. La implementación también admite otras macros de preprocesador específicas de Microsoft.
Algunas macros están definidas solo para entornos de compilación específicos o para opciones del compilador. Excepto donde se indique lo contrario, las macros se definen en una unidad de traducción como si se hubieran especificado como argumentos de la opción de compilador /D
. Cuando se define, el preprocesador expande las macros sus valores especificados antes de la compilación. Estas macros predefinidas no toman ningún argumento y no se pueden volver a definir.
Identificador predefinido estándar
El compilador admite este identificador predefinido especificado por ISO C99 e ISO C++11.
__func__
Nombre no completo y sin adornar de la función de inclusión como una matriz static const de función local dechar
.void example() { printf("%s\n", __func__); } // prints "example"
Macros predefinidas estándar
El compilador admite estas macros predefinidas especificadas por los estándares ISO C99, C11, C17 e ISO C++17.
__cplusplus
Se define como un valor literal entero cuando la unidad de traducción se compila como C++. De lo contrario, no se define.__DATE__
La fecha de compilación del archivo de código fuente actual. La fecha es un literal de cadena de longitud constante con el formato Mmm dd aaaa. El nombre del mes Mmm es el mismo que el nombre de mes abreviado que genera la función asctime de la biblioteca en tiempo de ejecución de C (CRT). El primer carácter de la fecha dd es un espacio si el valor es menor que 10. Esta macro siempre está definida.__FILE__
Nombre del archivo de código fuente actual.__FILE__
se expande a un literal de cadena de caracteres. Para garantizar que se muestra la ruta de acceso completa al archivo, use/FC
(Ruta de acceso completa de archivo de código fuente en diagnósticos). Esta macro siempre está definida.__LINE__
Se define como el número de línea entero del archivo de código fuente actual. El valor de esta macro se puede cambiar mediante una#line
directiva . El tipo entero del valor de__LINE__
puede variar en función del contexto. Esta macro siempre está definida.__STDC__
Se define como 1 cuando se compila como C y si se especifica la opción del compilador/Za
. A partir de la versión 17.2 de Visual Studio 2022, se define como 1 cuando se compila como C y si se especifica la/std:c11
opción del compilador o/std:c17
. De lo contrario, no se define.__STDC_HOSTED__
Se define como 1 si la implementación es una implementación hospedada que admite la biblioteca estándar completa requerida. De lo contrario, se define como 0.__STDC_NO_ATOMICS__
se define como 1 si la implementación no admite tipos atómicos estándar opcionales. La implementación de MSVC la define como 1 cuando se compila como C y se especifica una de las opciones C11 o C17 de/std
.__STDC_NO_COMPLEX__
se define como 1 si la implementación no admite números complejos estándar opcionales. La implementación de MSVC la define como 1 cuando se compila como C y se especifica una de las opciones C11 o C17 de/std
.__STDC_NO_THREADS__
se define como 1 si la implementación no admite subprocesos estándar opcionales. La implementación de MSVC la define como 1 cuando se compila como C y se especifica una de las opciones C11 o C17 de/std
.__STDC_NO_VLA__
se define como 1 si la implementación no admite matrices estándar de longitud variable. La implementación de MSVC la define como 1 cuando se compila como C y se especifica una de las opciones C11 o C17 de/std
.__STDC_VERSION__
se define cuando se compila como C y se especifica una de las opciones C11 o C17 de/std
. Se expande a201112L
para/std:c11
, y a201710L
para/std:c17
.__STDCPP_DEFAULT_NEW_ALIGNMENT__
Si se especifica/std:c17
o posterior, esta macro se expande a unsize_t
literal que tiene el valor de la alineación garantizado por una llamada aoperator new
sin reconocimiento de la alineación. Las alineaciones más grandes se pasan a una sobrecarga con reconocimiento de la alineación, comooperator new(std::size_t, std::align_val_t)
. Para obtener más información, consulte/Zc:alignedNew
(Asignación sobrealineada de C++17).__STDCPP_THREADS__
Se define como 1 solo si un programa puede tener más de un subproceso de ejecución y se compila como C++. De lo contrario, no se define.__TIME__
Hora de traducción de la unidad de traducción preprocesada. La hora es un literal de cadena de caracteres con la forma hh:mm:ss, igual que la hora devuelta por la función asctime de CRT. Esta macro siempre está definida.
Macros predefinidas específicas de Microsoft
MSVC admite otras macros predefinidas:
__ARM_ARCH
Se define como un literal entero que representa la versión de la arquitectura de ARM. El valor se define como 8 para la arquitectura armv8-A. Para la versión 8.1 y posteriores, el valor se escala para versiones secundarias, como X.Y, mediante la fórmula X * 100 + Y, tal como se define en la extensión del lenguaje ARM C. Por ejemplo, para Armv8.1,__ARM_ARCH
es 8 * 100 + 1 o 801. Para establecer la versión de arquitectura de ARM, consulte/arch (ARM64)
. Esta macro se introdujo en Visual Studio 2022, versión 17.10.__ATOM__
Se define como 1 cuando se establece la opción del compilador/favor:ATOM
y el destino del compilador es x86 o x64. De lo contrario, no se define.__AVX__
Se define como 1 cuando se establecen las/arch:AVX
opciones del compilador ,/arch:AVX2
/arch:AVX512
o/arch:AVX10.1
y el destino del compilador es x86 o x64. De lo contrario, no se define.__AVX2__
Se define como 1 cuando se establece la/arch:AVX2
opción del compilador ,/arch:AVX512
o/arch:AVX10.1
y el destino del compilador es x86 o x64. De lo contrario, no se define.__AVX512BW__
Se define como 1 cuando se establecen las opciones del compilador/arch:AVX512
o/arch:AVX10.1
, y el destino del compilador es x86 o x64. De lo contrario, no se define.__AVX512CD__
Se define como 1 cuando se establecen las opciones del compilador/arch:AVX512
o/arch:AVX10.1
, y el destino del compilador es x86 o x64. De lo contrario, no se define.__AVX512DQ__
Se define como 1 cuando se establecen las opciones del compilador/arch:AVX512
o/arch:AVX10.1
, y el destino del compilador es x86 o x64. De lo contrario, no se define.__AVX512F__
Se define como 1 cuando se establecen las opciones del compilador/arch:AVX512
o/arch:AVX10.1
, y el destino del compilador es x86 o x64. De lo contrario, no se define.__AVX512VL__
Se define como 1 cuando se establecen las opciones del compilador/arch:AVX512
o/arch:AVX10.1
, y el destino del compilador es x86 o x64. De lo contrario, no se define.__AVX10_VER__
Se define como un entero que representa la versión de AVX10 cuando se establece la/arch:AVX10.1
opción del compilador y el destino del compilador es x86 o x64. De lo contrario, no se define._CHAR_UNSIGNED
Se define como 1 si el tipochar
predeterminado no tiene signo. Este valor se define cuando se establece la opción del compilador/J
(El tipo de carácter predeterminado no tiene signo). De lo contrario, no se define.__CLR_VER
Se define como un literal entero que representa la versión de Common Language Runtime (CLR) utilizada para compilar la aplicación. El valor se codifica con la formaMmmbbbbb
, dondeM
es la versión principal del runtime,mm
es la versión secundaria del runtime ybbbbb
es el número de compilación.__CLR_VER
se define si se establece la opción del compilador/clr
. De lo contrario, no se define.// clr_ver.cpp // compile with: /clr using namespace System; int main() { Console::WriteLine(__CLR_VER); }
_CONTROL_FLOW_GUARD
Se define como 1 cuando se establece la opción del compilador/guard:cf
(Habilitar protección del flujo de control). De lo contrario, no se define.__COUNTER__
Se expande a un literal entero que comienza en 0. El valor se incrementa en 1 cada vez que se usa en un archivo de origen o en encabezados incluidos del archivo de origen.__COUNTER__
recuerda su estado cuando se usan encabezados precompilados. Esta macro siempre está definida.En este ejemplo se usa
__COUNTER__
para asignar identificadores únicos a tres objetos diferentes del mismo tipo. El constructorexampleClass
toma un entero como parámetro. Enmain
, la aplicación declara tres objetos de tipoexampleClass
, usando__COUNTER__
como parámetro de identificador único:// macro__COUNTER__.cpp // Demonstration of __COUNTER__, assigns unique identifiers to // different objects of the same type. // Compile by using: cl /EHsc /W4 macro__COUNTER__.cpp #include <stdio.h> class exampleClass { int m_nID; public: // initialize object with a read-only unique ID exampleClass(int nID) : m_nID(nID) {} int GetID(void) { return m_nID; } }; int main() { // __COUNTER__ is initially defined as 0 exampleClass e1(__COUNTER__); // On the second reference, __COUNTER__ is now defined as 1 exampleClass e2(__COUNTER__); // __COUNTER__ is now defined as 2 exampleClass e3(__COUNTER__); printf("e1 ID: %i\n", e1.GetID()); printf("e2 ID: %i\n", e2.GetID()); printf("e3 ID: %i\n", e3.GetID()); // Output // ------------------------------ // e1 ID: 0 // e2 ID: 1 // e3 ID: 2 return 0; }
__cplusplus_cli
Se define como el valor literal entero 200406 cuando se compila como C++ y se establece una opción del compilador/clr
. De lo contrario, no se define. Cuando se define,__cplusplus_cli
está activo en la unidad de traducción.// cplusplus_cli.cpp // compile by using /clr #include "stdio.h" int main() { #ifdef __cplusplus_cli printf("%d\n", __cplusplus_cli); #else printf("not defined\n"); #endif }
__cplusplus_winrt
Se define como el valor literal entero 201009 cuando se compila como C++ y se establece la opción del compilador/ZW
(Compilación de Windows Runtime). De lo contrario, no se define._CPPRTTI
Se define como 1 si se establece la opción del compilador/GR
(Habilitar la información de tipo en tiempo de ejecución). De lo contrario, no se define._CPPUNWIND
Se define como 1 si se establecen una o más de las opciones del compilador/GX
(Habilitar el control de excepciones),/clr
(Compilación de Common Language Runtime) o/EH
(Modelo de control de excepciones). De lo contrario, no se define._DEBUG
Se define como 1 cuando se establecen las opciones del compilador/LDd
/MDd
, o/MTd
. De lo contrario, no se define._DLL
Se define como 1 cuando se establecen las opciones del compilador/MD
o/MDd
(DLL multiproceso). De lo contrario, no se define.__FUNCDNAME__
Se define como literal de cadena que contiene el nombre representativo de la función de inclusión. La macro solo se define dentro de una función. La macro__FUNCDNAME__
no se expande si se usan las opciones del compilador/EP
o/P
.En este ejemplo se usan las macros
__FUNCDNAME__
,__FUNCSIG__
y__FUNCTION__
para mostrar la información de la función.// Demonstrates functionality of __FUNCTION__, __FUNCDNAME__, and __FUNCSIG__ macros void exampleFunction() { printf("Function name: %s\n", __FUNCTION__); printf("Decorated function name: %s\n", __FUNCDNAME__); printf("Function signature: %s\n", __FUNCSIG__); // Sample Output // ------------------------------------------------- // Function name: exampleFunction // Decorated function name: ?exampleFunction@@YAXXZ // Function signature: void __cdecl exampleFunction(void) }
__FUNCSIG__
Se define como literal de cadena que contiene la firma de la función de inclusión. La macro solo se define dentro de una función. La macro__FUNCSIG__
no se expande si se usan las opciones del compilador/EP
o/P
. Cuando se compila para un destino de 64 bits, la convención de llamada es__cdecl
de forma predeterminada. Para obtener un ejemplo de uso, vea la macro__FUNCDNAME__
.__FUNCTION__
Se define como literal de cadena que contiene el nombre no representativo de la función de inclusión. La macro solo se define dentro de una función. La macro__FUNCTION__
no se expande si se usan las opciones del compilador/EP
o/P
. Para obtener un ejemplo de uso, vea la macro__FUNCDNAME__
._INTEGRAL_MAX_BITS
Se define como el valor literal entero 64, el tamaño máximo (en bits) para un tipo entero no vector. Esta macro siempre está definida.// integral_max_bits.cpp #include <stdio.h> int main() { printf("%d\n", _INTEGRAL_MAX_BITS); }
__INTELLISENSE__
Se define como 1 durante un paso del compilador de IntelliSense en el IDE de Visual Studio. De lo contrario, no se define. Puede usar esta macro para proteger el código que el compilador de IntelliSense no entiende o para alternar entre la compilación y el compilador de IntelliSense. Para más información, vea Sugerencias para la solución de problemas de ralentización de IntelliSense._ISO_VOLATILE
Se define como 1 si se establece la opción del compilador/volatile:iso
. De lo contrario, no se define._KERNEL_MODE
Se define como 1 si se establece la opción del compilador/kernel
(Crear binario en modo kernel). De lo contrario, no se define._M_AMD64
Se define como el valor literal entero 100 para compilaciones destinadas a procesadores x64 o ARM64EC. De lo contrario, no se define._M_ARM
Se define como el valor literal entero 7 para las compilaciones destinadas a procesadores ARM. No se define para ARM64, ARM64EC ni otros destinos._M_ARM_ARMV7VE
Se define como 1 cuando se establece la opción del compilador/arch:ARMv7VE
para las compilaciones destinadas a procesadores ARM. De lo contrario, no se define._M_ARM_FP
Se define como un valor literal entero que indica qué opción del compilador/arch
se estableció para destinos de procesador ARM. De lo contrario, no se define.Valor en el rango entre 30 y 39 si no se especificó ninguna opción
/arch
de ARM, lo que indica que se usó la arquitectura predeterminada para la ARM (VFPv3
).Valor en el rango entre 40 y 49 si se estableció
/arch:VFPv4
.Para obtener más información, consulte
/arch
(ARM).
_M_ARM64
Se define como 1 para las compilaciones que tienen como destino ARM64. De lo contrario, no se define._M_ARM64EC
Se define como 1 para las compilaciones que tienen como destino ARM64EC. De lo contrario, no se define._M_CEE
Se define como 001 si se establece alguna opción del compilador/clr
(Compilación de Common Language Runtime). De lo contrario, no se define._M_CEE_PURE
En desuso a partir de Visual Studio 2015. Se define como 001 si se establece la opción del compilador/clr:pure
. De lo contrario, no se define._M_CEE_SAFE
En desuso a partir de Visual Studio 2015. Se define como 001 si se establece la opción del compilador/clr:safe
. De lo contrario, no se define._M_FP_CONTRACT
Disponible a partir de Visual Studio 2022. Se define como 1 si se establece la/fp:contract
opción del compilador o/fp:fast
. De lo contrario, no se define._M_FP_EXCEPT
Se define como 1 si se establecen las opciones del compilador/fp:except
o/fp:strict
. De lo contrario, no se define._M_FP_FAST
Se define como 1 si se establece la opción del compilador/fp:fast
. De lo contrario, no se define._M_FP_PRECISE
Se define como 1 si se establece la opción del compilador/fp:precise
. De lo contrario, no se define._M_FP_STRICT
Se define como 1 si se establece la opción del compilador/fp:strict
. De lo contrario, no se define._M_IX86
Se define como el valor literal entero 600 para las compilaciones destinadas a procesadores x86. Esta macro no está definida para los destinos de compilación x64 o ARM._M_IX86_FP
Se define como un valor literal entero que indica la opción del compilador/arch
que se estableció, o el valor predeterminado. Esta macro siempre se define cuando el destino de compilación es un procesador x86. De lo contrario, no se define. Cuando se define, el valor es:0 si la opción del compilador
/arch:IA32
se ha establecido.1 si la opción del compilador
/arch:SSE
se ha establecido.2 si se estableció la
/arch:SSE2
opción del compilador ,/arch:AVX
/arch:AVX2
,/arch:AVX512
o/arch:AVX10.1
. Este valor es el predeterminado si no se ha especificado una opción del compilador/arch
. Cuando se especifica/arch:AVX
, la macro__AVX__
también se define. Cuando se especifica/arch:AVX2
, también se definen__AVX__
y__AVX2__
. Cuando se especifica/arch:AVX512
, también se definen__AVX__
,__AVX2__
,__AVX512BW__
,__AVX512CD__
,__AVX512DQ__
,__AVX512F__
y__AVX512VL__
. Cuando/arch:AVX10.1
se especifica ,__AVX__
,__AVX2__
,__AVX512BW__
__AVX512CD__
,__AVX512DQ__
, ,__AVX512F__
y__AVX512VL__
__AVX10_VER__
también se definen.Para obtener más información, vea
/arch
(x86).
_M_X64
Se define como el valor literal entero 100 para compilaciones destinadas a procesadores x64 o ARM64EC. De lo contrario, no se define._MANAGED
Se define como 1 cuando se establece la opción del compilador/clr
. De lo contrario, no se define._MSC_BUILD
Se define como un literal entero que contiene el elemento de número de revisión del número de versión del compilador. El número de revisión es el último elemento del número de versión delimitado por períodos. Por ejemplo, si el número de versión del compilador de Microsoft C/C++ es 15.00.20706.01, la_MSC_BUILD
macro es 1. Esta macro siempre está definida._MSC_EXTENSIONS
Se define como 1 si se establece la opción del compilador/Ze
(Habilitar extensiones de lenguaje). De lo contrario, no se define._MSC_FULL_VER
Se define como un literal de entero que codifica los elementos principal, secundario y de compilación del número de versión del compilador. El número principal es el primer elemento del número de versión delimitado por puntos, el número secundario es el segundo elemento y el número de compilación es el tercer elemento.Por ejemplo, si la versión del compilador de Microsoft C/C++ es 19.39.33519,
_MSC_FULL_VER
es 193933519. Escribacl /?
en la línea de comandos para ver el número de versión del compilador. Esta macro siempre está definida. Para obtener más información sobre el control de versiones del compilador, vea Control de versiones del compilador de C++ y, específicamente , versiones del servicio a partir de Visual Studio 2017 para obtener más información sobre Visual Studio 2019 16.8, 16.9, 16.10 y 16.11, que requieren_MSC_FULL_VER
distinguirlas._MSC_VER
Se define como un literal entero que codifica los elementos principal y secundario del número de versión del compilador. El número principal es el primer elemento del número de versión delimitado por puntos y el número secundario es el segundo elemento. Por ejemplo, si el número de versión del compilador de Microsoft C/C++ es 17.00.51106.1, el valor de_MSC_VER
es 1700. Escribacl /?
en la línea de comandos para ver el número de versión del compilador. Esta macro siempre está definida.Para probar las versiones o actualizaciones del compilador en una versión determinada de Visual Studio o posterior, use el
>=
operador . Puede usarlo en una directiva condicional para comparar_MSC_VER
con esa versión conocida. Si quiere comparar varias versiones mutuamente excluyentes, ordene las comparaciones por orden descendiente de número de versión. Por ejemplo, este código comprueba los compiladores publicados en Visual Studio 2017 y versiones posteriores. A continuación, comprueba los compiladores publicados en Visual Studio 2015 o versiones posteriores. Después, comprueba todos los compiladores publicados antes de Visual Studio 2015:#if _MSC_VER >= 1910 // . . . #elif _MSC_VER >= 1900 // . . . #else // . . . #endif
Para obtener más información sobre Visual Studio 2019 16.8 y 16.9, y 16.10 y 16.11, que comparten las mismas versiones principales y secundarias (y, por tanto, tienen el mismo valor para
_MSC_VER
), vea Versiones de servicio a partir de Visual Studio 2017.Para obtener más información sobre el historial del control de versiones del compilador y los números de versión del compilador y las versiones de Visual Studio a las que corresponden, consulte Control de versiones del compilador de C++. Además, Visual C++ Compiler Version (Versión del compilador de Visual C++) en el blog del equipo de Microsoft C++.
_MSVC_LANG
Se define como un literal entero que especifica el estándar de lenguaje de C++ de destino del compilador. Solo el código compilado como C++ lo establece. La macro es el valor literal entero201402L
de forma predeterminada o cuando se especifica la opción del compilador/std:c++14
. La macro se establece en201703L
si se especifica la opción del compilador/std:c++17
. La macro se establece en202002L
si se especifica la opción del compilador/std:c++20
. Se establece en un valor más alto y sin especificar cuando se especifica la opción/std:c++latest
. De lo contrario, la macro no se define. La macro_MSVC_LANG
y las opciones del compilador/std
(Especificar la versión estándar del lenguaje) están disponibles a partir de Visual Studio 2015 Update 3.__MSVC_RUNTIME_CHECKS
Se define como 1 cuando se establece una de las opciones del compilador/RTC
. De lo contrario, no se define._MSVC_TRADITIONAL
:- Disponible a partir de la versión 15.8 de Visual Studio 2017: se define como 0 cuando se establece la opción del compilador del modo
/experimental:preprocessor
de conformidad del preprocesador. Se define como 1 de forma predeterminada, o cuando se establece la opción del compilador/experimental:preprocessor-
, para indicar que está en uso el preprocesador tradicional. - Disponible a partir de la versión 16.5 de Visual Studio 2019: se define como 0 cuando se establece la opción del compilador del modo
/Zc:preprocessor
de conformidad del preprocesador. Se define como 1 de forma predeterminada, o cuando se establece la opción del compilador/Zc:preprocessor-
, para indicar que el preprocesador tradicional está en uso (básicamente,/Zc:preprocessor
reemplaza a/experimental:preprocessor
, que está en desuso).
#if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL // Logic using the traditional preprocessor #else // Logic using cross-platform compatible preprocessor #endif
- Disponible a partir de la versión 15.8 de Visual Studio 2017: se define como 0 cuando se establece la opción del compilador del modo
_MT
Se define como 1 cuando se especifica/MD
o/MDd
(DLL multiproceso), o bien/MT
o/MTd
(Multiproceso). De lo contrario, no se define._NATIVE_WCHAR_T_DEFINED
Se define como 1 cuando se establece la opción del compilador/Zc:wchar_t
. De lo contrario, no se define._OPENMP
Se define como literal entero 200203, si se establece la opción del compilador/openmp
(Habilitar la compatibilidad con OpenMP 2.0). Este valor representa la fecha de la especificación de OpenMP implementada por MSVC. De lo contrario, no se define.// _OPENMP_dir.cpp // compile with: /openmp #include <stdio.h> int main() { printf("%d\n", _OPENMP); }
_PREFAST_
Se define como 1 cuando se establece la opción del compilador/analyze
. De lo contrario, no se define.__SANITIZE_ADDRESS__
Disponible a partir de la versión 16.9 de Visual Studio 2019. Se define como 1 cuando se establece la/fsanitize=address
opción del compilador. De lo contrario, no se define.__TIMESTAMP__
Se define como un literal de cadena que contiene la fecha y hora de la última modificación del archivo de código fuente actual, en el formato de longitud constante abreviado devuelto por la funciónasctime
de CRT; por ejemplo,Fri 19 Aug 13:32:58 2016
. Esta macro siempre está definida._VC_NODEFAULTLIB
Se define como 1 cuando se establece la opción del compilador/Zl
(Omitir nombre de biblioteca predeterminada). De lo contrario, no se define._WCHAR_T_DEFINED
Se define como 1 cuando se establece la opción del compilador/Zc:wchar_t
predeterminada. La macro_WCHAR_T_DEFINED
está definida, pero no tiene ningún valor si se establece la opción del compilador/Zc:wchar_t-
ywchar_t
se define en un archivo de encabezado del sistema incluido en el proyecto. De lo contrario, no se define._WIN32
Se define como 1 cuando el destino de compilación es ARM de 32 bits, ARM de 64 bits, x86 o x64. De lo contrario, no se define._WIN64
Se define como 1 cuando el destino de compilación es ARM de 64 bits o x64. De lo contrario, no se define._WINRT_DLL
Se define como 1 cuando se compila como C++ y se establecen las opciones del compilador/ZW
(Compilación de Windows Runtime) y/LD
o/LDd
. De lo contrario, no se define.
No hay ninguna macro de preprocesador que identifique la versión de la biblioteca ATL o MFC predefinida por el compilador. Los encabezados de la biblioteca ATL y MFC definen internamente estas macros de versión. No están definidas en las directivas de preprocesador creadas antes de incluir el encabezado necesario.
_ATL_VER
Se define en<atldef.h>
como un literal entero que codifica el número de versión de ATL._MFC_VER
Se define en<afxver_.h>
como un literal entero que codifica el número de versión de MFC.
Consulte también
Macros (C/C++)
Operadores de preprocesador
Directivas de preprocesador