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 de char.

    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 a 201112L para /std:c11, y a 201710L para /std:c17.

  • __STDCPP_DEFAULT_NEW_ALIGNMENT__ Si se especifica /std:c17 o posterior, esta macro se expande a un size_t literal que tiene el valor de la alineación garantizado por una llamada a operator new sin reconocimiento de la alineación. Las alineaciones más grandes se pasan a una sobrecarga con reconocimiento de la alineación, como operator 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:

  • __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 opciones del compilador /arch:AVX/arch:AVX2, /arch:AVX512 y el destino del compilador es x86 o x64. De lo contrario, no se define.

  • __AVX2__ Se define como 1 cuando se establecen las opciones del compilador /arch:AVX2 o /arch:AVX512, y el destino del compilador es x86 o x64. De lo contrario, no se define.

  • __AVX512BW__ Se define como 1 cuando se establece la opción del compilador /arch:AVX512 y el destino del compilador es x86 o x64. De lo contrario, no se define.

  • __AVX512CD__ Se define como 1 cuando se establece la opción del compilador /arch:AVX512 y el destino del compilador es x86 o x64. De lo contrario, no se define.

  • __AVX512DQ__ Se define como 1 cuando se establece la opción del compilador /arch:AVX512 y el destino del compilador es x86 o x64. De lo contrario, no se define.

  • __AVX512F__ Se define como 1 cuando se establece la opción del compilador /arch:AVX512 y el destino del compilador es x86 o x64. De lo contrario, no se define.

  • __AVX512VL__ Se define como 1 cuando se establece la opción del compilador /arch:AVX512 y el destino del compilador es x86 o x64. De lo contrario, no se define.

  • _CHAR_UNSIGNED Se define como 1 si el tipo char 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 forma Mmmbbbbb, donde M es la versión principal del runtime, mm es la versión secundaria del runtime y bbbbb 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 código fuente o en encabezados incluidos del archivo de código fuente. __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 constructor exampleClass toma un entero como parámetro. En main, la aplicación declara tres objetos de tipo exampleClass, 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 la opción del compilador /arch:SSE2, /arch:AVX, /arch:AVX2 o /arch:AVX512 se ha establecido. 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__.

    • 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. Escriba cl /? 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. Escriba cl /? 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. Se establece solo en código compilado como C++. La macro es el valor literal entero 201402L de forma predeterminada o cuando se especifica la opción del compilador /std:c++14. La macro se establece en 201703L si se especifica la opción del compilador /std:c++17. La macro se establece en 202002L 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
    
  • _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ón asctime 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- y wchar_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