Macros predefinidas

O compilador do Microsoft C/C++ (MSVC) predefine certas macros de pré-processador, dependendo da linguagem (C ou C++), do destino da compilação e das opções de compilador escolhidas.

O MSVC dá suporte às macros predefinidas do pré-processador exigidas pelas normas ANSI/ISO C99, C11 e C17 e as normas ISO C++14, C++17 e C++20. A implementação também dá suporte a várias outras macros de pré-processador específicas da Microsoft. Algumas macros são definidas apenas para ambientes de compilação ou opções de compilador específicos. Exceto quando observado, as macros são definidas em uma unidade de tradução como se estivessem definidas como argumentos de opção do compilador /D. Quando definidas, as macros são expandidas para os valores especificados pelo pré-processador antes da compilação. As macros predefinidas não têm argumentos e não podem ser redefinidas.

Identificador predefinido padrão

O compilador dá suporte a esse identificador predefinido especificado pela ISO C99 e ISO C++11.

  • __func__ O nome não qualificado e não adornado da função de inclusão como uma matriz static const local de função de char.

    void example(){
        printf("%s\n", __func__);
    } // prints "example"
    

Macros predefinidas padrão

O compilador dá suporte a essas macros predefinidas especificadas pelas normas ISO C99, C11, C17 e ISO C++17.

  • __cplusplus Definida como um valor literal inteiro quando a unidade de tradução estiver compilada como C++. Caso contrário, é indefinido.

  • __DATE__ A data de compilação do arquivo de origem atual. A data é uma literal de cadeia de caracteres de tamanho constante no formato Mmm dd aaaa. O nome do mês Mmm é igual ao nome de mês abreviado gerado pela função de asctime da biblioteca do CRT (Runtime C). O primeiro caractere da data dd será um espaço se o valor for menor que 10. Essa macro está sempre definida.

  • __FILE__ O nome do arquivo de origem atual. __FILE__ expande para um literal de cadeia de caracteres. Para garantir que o caminho completo para o arquivo seja exibido, use /FC (Caminho completo do arquivo de código-fonte no diagnóstico). Essa macro está sempre definida.

  • __LINE__ Definida como o número de linha inteiro no arquivo de origem atual. O valor da macro __LINE__ pode ser alterado usando uma diretiva #line. O tipo integral do valor de __LINE__ pode variar dependendo do contexto. Essa macro está sempre definida.

  • __STDC__ Definida como 1 quando compilada como C e se a opção do compilador /Za estiver especificada. A partir do Visual Studio 2022 versão 17.2, ela também é definida como 1 quando compilada como C e se a opção do compilador /std:c11 ou /std:c17 estiver especificada. Caso contrário, é indefinido.

  • __STDC_HOSTED__ Definida como 1 se a implementação for uma implementação hospedada, a qual dê suporte a toda a biblioteca padrão necessária. Caso contrário, será definida como 0.

  • __STDC_NO_ATOMICS__ Definida como 1 se a implementação não der suporte à atômica padrão opcional. A implementação do MSVC define-a como 1 quando compilada como C e uma das opções /std C11 ou C17 estiver especificada.

  • __STDC_NO_COMPLEX__ Definida como 1 se a implementação não der suporte a números complexos padrão opcionais. A implementação do MSVC define-a como 1 quando compilada como C e uma das opções /std C11 ou C17 estiver especificada.

  • __STDC_NO_THREADS__ Definida como 1 se a implementação não der suporte a threads padrão opcionais. A implementação do MSVC define-a como 1 quando compilada como C e uma das opções /std C11 ou C17 estiver especificada.

  • __STDC_NO_VLA__ Definida como 1 se a implementação não der suporte a matrizes de comprimento variável padrão. A implementação do MSVC define-a como 1 quando compilada como C e uma das opções /std C11 ou C17 estiver especificada.

  • __STDC_VERSION__ Definida quando compilada como C e uma das opções /std C11 ou C17 estiver especificada. Ela se expande como 201112L para /std:c11 e como 201710L para /std:c17.

  • __STDCPP_DEFAULT_NEW_ALIGNMENT__ Quando /std:c17 ou mais recente for especificado, essa macro se expandirá para um literal size_t que tem o valor do alinhamento garantido por uma chamada para operator new sem reconhecimento de alinhamento. Alinhamentos maiores são passados para uma sobrecarga com reconhecimento de alinhamento, como operator new(std::size_t, std::align_val_t). Para obter mais informações, confira /Zc:alignedNew (alocação com excesso de alinhamento do C++17).

  • __STDCPP_THREADS__ Definida como 1 se e somente se um programa puder ter mais de um thread de execução e compilado como C++. Caso contrário, é indefinido.

  • __TIME__ O tempo de tradução da unidade de tradução pré-processada. A hora é um literal de cadeia de caracteres do formulário hh:mm:ss, o mesmo que o tempo retornado pela função asctime do CRT. Essa macro está sempre definida.

Macros predefinidas específicas da Microsoft

O MSVC dá suporte a essas macros predefinidas adicionais.

  • __ATOM__ Definida como 1 quando a opção do compilador /favor:ATOM estiver definida e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.

  • __AVX__ Definida como 1 quando as opções do compilador /arch:AVX, /arch:AVX2 ou /arch:AVX512 estiverem definidas e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.

  • __AVX2__ Definida como 1 quando as opções do compilador /arch:AVX2 ou /arch:AVX512 estiverem definidas e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.

  • __AVX512BW__ Definida como 1 quando a opção do compilador /arch:AVX512 estiver definida e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.

  • __AVX512CD__ Definida como 1 quando a opção do compilador /arch:AVX512 estiver definida e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.

  • __AVX512DQ__ Definida como 1 quando a opção do compilador /arch:AVX512 estiver definida e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.

  • __AVX512F__ Definida como 1 quando a opção do compilador /arch:AVX512 estiver definida e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.

  • __AVX512VL__ Definida como 1 quando a opção do compilador /arch:AVX512 estiver definida e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.

  • _CHAR_UNSIGNED Definida como 1 se o tipo padrão char não estiver assinado. Esse valor será definido quando a opção do compilador /J (tipo de caractere padrão não assinado) estiver definida. Caso contrário, é indefinido.

  • __CLR_VER Definida como um literal inteiro que representa a versão do CLR (Common Language Runtime) usado para compilar o aplicativo. O valor é codificado no formulário Mmmbbbbb, em que M é a versão principal do runtime, mm é a versão secundária do runtime, e bbbbb é o número de build. __CLR_VER será definida se a opção do compilador /clrestiver definida. Caso contrário, é indefinido.

    // clr_ver.cpp
    // compile with: /clr
    using namespace System;
    int main() {
       Console::WriteLine(__CLR_VER);
    }
    
  • _CONTROL_FLOW_GUARD Definida como 1 quando a opção do compilador /guard:cf (Habilitar a proteção do fluxo de controle) estiver definida. Caso contrário, é indefinido.

  • __COUNTER__ Expande para um literal inteiro que começa em 0. O valor será incrementado por 1 sempre que for usado em um arquivo de origem ou em cabeçalhos incluídos do arquivo de origem. __COUNTER__ lembra seu estado quando você usa cabeçalhos pré-compilados. Essa macro está sempre definida.

    Este exemplo usa __COUNTER__ para atribuir identificadores exclusivos para três objetos diferentes do mesmo tipo. O construtor exampleClass aceita um inteiro como um parâmetro. Em main, o aplicativo declara três objetos do tipo exampleClass, usando __COUNTER__ como o parâmetro identificador exclusivo:

    // 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 Definida como o valor literal inteiro 200406 quando compilada como C++ e uma opção do compilador /clr estiver definida. Caso contrário, é indefinido. Quando definido, o __cplusplus_cli é aplicado em toda a unidade de tradução.

    // 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_winrtDefinida como o valor literal inteiro 201009 quando compilada como C++ e a opção do compilador /ZW (Compilação do Windows Runtime) estiver definida. Caso contrário, é indefinido.

  • _CPPRTTI Definida como 1 se a opção do compilador /GR (Habilitar informações do tipo em tempo de execução) estiver definida. Caso contrário, é indefinido.

  • _CPPUNWINDDefinida como 1 se uma ou mais opções do compilador /GX (Habilitar tratamento de exceções), /clr (Compilação Common Language Runtime) ou /EH (Modelo de Tratamento de Exceção) estiverem definidas. Caso contrário, é indefinido.

  • _DEBUG Definida como 1 quando a opção do compilador /LDd, /MDd ou /MTd estiver definida. Caso contrário, é indefinido.

  • _DLL Definida como 1 quando a opção do compilador /MD ou /MDd (DLL com multithreaded) estiver definida. Caso contrário, é indefinido.

  • __FUNCDNAME__ Definida como um literal de cadeia de caracteres que contém o nome decorado da função de delimitação. A macro só é definida dentro de uma função. A macro __FUNCDNAME__ não será expandida se você usar a opção do compilador /EP ou /P.

    Este exemplo usa as macros __FUNCDNAME__, __FUNCSIG__ e __FUNCTION__ para exibir informações de função.

    // 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__ Definida como um literal de cadeia de caracteres que contém a assinatura da função de delimitação. A macro só é definida dentro de uma função. A macro __FUNCSIG__ não será expandida se você usar a opção do compilador /EP ou /P. Quando compilada para um destino de 64 bits, a convenção de chamada é __cdecl por padrão. Para obter um exemplo de uso, confira a macro __FUNCDNAME__.

  • __FUNCTION__ Definida como um literal de cadeia de caracteres que contém o nome não decorado da função de delimitação. A macro só é definida dentro de uma função. A macro __FUNCTION__ não será expandida se você usar a opção do compilador /EP ou /P. Para obter um exemplo de uso, confira a macro __FUNCDNAME__.

  • _INTEGRAL_MAX_BITS Definida como o valor literal inteiro 64, o tamanho máximo (em bits) para um tipo integral não vetor. Essa macro está sempre definida.

    // integral_max_bits.cpp
    #include <stdio.h>
    int main() {
        printf("%d\n", _INTEGRAL_MAX_BITS);
    }
    
  • __INTELLISENSE__ Definida como 1 durante uma passagem do compilador do IntelliSense no IDE do Visual Studio. Caso contrário, é indefinido. Você pode usar essa macro para proteger o código que o compilador do IntelliSense não entender ou usá-la para alternar entre a compilação e o compilador do IntelliSense. Para obter mais informações, confira Dicas de solução de problemas para a lentidão do IntelliSense.

  • _ISO_VOLATILE Definida como 1 se a opção do compilador /volatile:iso estiver definida. Caso contrário, é indefinido.

  • _KERNEL_MODE Definida como 1 se a opção do compilador /kernel (Criar binário do modo Kernel) estiver definida. Caso contrário, é indefinido.

  • _M_AMD64 Definido como o valor literal inteiro 100 para compilações direcionadas a processadores x64 ou ARM64EC. Caso contrário, é indefinido.

  • _M_ARM Definida como o valor literal inteiro 7 para compilações direcionadas a processadores ARM. Indefinido para ARM64, ARM64EC e outros destinos.

  • _M_ARM_ARMV7VE Definida como 1 quando a opção do compilador /arch:ARMv7VE estiver definida para compilações direcionadas a processadores ARM. Caso contrário, é indefinido.

  • _M_ARM_FP Definida como um valor literal inteiro que indica qual opção do compilador /arch foi definida para destinos de processador ARM. Caso contrário, é indefinido.

    • Um valor no intervalo 30-39, se nenhuma opção ARM /arch tiver sido especificada, indicando que a arquitetura padrão para ARM foi definida (VFPv3).

    • Um valor no intervalo de 40 a 49 se /arch:VFPv4 estiver definido.

    • Para obter mais informações, confira /arch(ARM).

  • _M_ARM64 Definido como 1 para compilações direcionadas ao ARM64. Caso contrário, é indefinido.

  • _M_ARM64EC Definido como 1 para compilações direcionadas ao ARM64EC. Caso contrário, é indefinido.

  • _M_CEE Definida como 001 se alguma opção do compilador /clr (Compilação Common Language Runtime) estiver definida. Caso contrário, é indefinido.

  • _M_CEE_PURE Preterida a partir do Visual Studio 2015. Definida como 001 se a opção do compilador /clr:pure estiver definida. Caso contrário, é indefinido.

  • _M_CEE_SAFE Preterida a partir do Visual Studio 2015. Definida como 001 se a opção do compilador /clr:safe estiver definida. Caso contrário, é indefinido.

  • _M_FP_CONTRACT Disponível a partir do Visual Studio 2022. Definida como 1 se a opção do compilador /fp:contract ou /fp:fast estiver definida. Caso contrário, é indefinido.

  • _M_FP_EXCEPT Definida como 1 se a opção do compilador /fp:except ou /fp:strict estiver definida. Caso contrário, é indefinido.

  • _M_FP_FAST Definida como 1 se a opção do compilador /fp:fast estiver definida. Caso contrário, é indefinido.

  • _M_FP_PRECISE Definida como 1 se a opção do compilador /fp:precise estiver definida. Caso contrário, é indefinido.

  • _M_FP_STRICT Definida como 1 se a opção do compilador /fp:strict estiver definida. Caso contrário, é indefinido.

  • _M_IX86 Definida como o valor literal inteiro 600 para compilações direcionadas a processadores x86. Essa macro não está definida para destinos de compilação x64 ou ARM.

  • _M_IX86_FP Definida como um valor literal inteiro que indica a opção do compilador /arch que foi definida ou o padrão. Essa macro está sempre definida quando o destino da compilação for um processador x86. Caso contrário, é indefinido. Quando definido, o valor é:

    • 0 se a opção do compilador /arch:IA32 estiver definida.

    • 1 se a opção do compilador /arch:SSE estiver definida.

    • 2 se a opção do compilador /arch:SSE2, /arch:AVX, /arch:AVX2 ou /arch:AVX512 estiver definida. Esse valor será o padrão se uma opção do compilador /arch não tiver sido especificada. Quando /arch:AVX for especificada, a macro __AVX__ também será definida. Quando /arch:AVX2 for especificada, tanto __AVX__ quanto __AVX2__ também serão definidas. Quando /arch:AVX512 for especificada, __AVX__, __AVX2__, __AVX512BW__, __AVX512CD__, __AVX512DQ__, __AVX512F__ e __AVX512VL__ também serão definidas.

    • Para obter mais informações, confira /arch (x86).

  • _M_X64 Definido como o valor literal inteiro 100 para compilações direcionadas a processadores x64 ou ARM64EC. Caso contrário, é indefinido.

  • _MANAGED Definida como 1 quando a opção do compilador /clr estiver definida. Caso contrário, é indefinido.

  • _MSC_BUILD Definida como um literal inteiro que contém o elemento do número de revisão do número de versão do compilador. O número de revisão é o quarto elemento do número de versão delimitado por período. Por exemplo, se o número de versão do compilador do Microsoft C/C++ for 15.00.20706.01, a macro _MSC_BUILD será avaliada em 1. Essa macro está sempre definida.

  • _MSC_EXTENSIONS Definida como 1 se a opção do compilador habilitada por padrão /Ze (Habilitar extensões de linguagem) estiver definida. Caso contrário, é indefinido.

  • _MSC_FULL_VER Definida como um literal inteiro que codifica os elementos principais, secundários e de número de build do número de versão do compilador. O número principal é o primeiro elemento do número de versão delimitado por ponto, o número secundário é o segundo elemento, e o número de compilação é o terceiro elemento. Por exemplo, se o número de versão do compilador do Microsoft C/C++ for 15.00.20706.01, a macro _MSC_FULL_VER será avaliada em 150020706. Insira cl /? na linha de comando para exibir o número de versão do compilador. Essa macro está sempre definida.

  • _MSC_VER Definida como um literal inteiro que codifica os elementos principais e secundários do número de versão do compilador. O número principal é o primeiro elemento do número de versão delimitado por ponto e o número secundário é o segundo elemento. Por exemplo, se o número de versão do compilador do Microsoft C/C++ for 17.00.51106.1, a macro _MSC_VER será avaliada em 1700. Insira cl /? na linha de comando para exibir o número de versão do compilador. Essa macro está sempre definida.

    Versão do Visual Studio _MSC_VER
    Visual Studio 6.0 1200
    Visual Studio .NET 2002 (7.0) 1300
    Visual Studio .NET 2003 (7.1) 1310
    Visual Studio 2005 (8.0) 1.400
    Visual Studio 2008 (9.0) 1500
    Visual Studio 2010 (10.0) 1600
    Visual Studio 2012 (11.0) 1.700
    Visual Studio 2013 (12.0) 1800
    Visual Studio 2015 (14.0) 1900
    Visual Studio 2017 RTW (15.0) 1910
    Visual Studio 2017 versão 15.3 1911
    Visual Studio 2017 versão 15.5 1912
    Visual Studio 2017 versão 15.6 1913
    Visual Studio 2017 versão 15.7 1914
    Visual Studio 2017 versão 15.8 1915
    Visual Studio 2017 versão 15.9 1916
    Visual Studio 2019 RTW (16.0) 1920
    Visual Studio 2019 versão 16.1 1921
    Visual Studio 2019 versão 16.2 1922
    Visual Studio 2019 versão 16.3 1923
    Visual Studio 2019 versão 16.4 1924
    Visual Studio 2019 versão 16.5 1925
    Visual Studio 2019 versão 16.6 1926
    Visual Studio 2019 versão 16.7 1927
    Visual Studio 2019 versão 16.8, 16.9 1928
    Visual Studio 2019 versão 16.10, 16.11 1929
    Visual Studio 2022 RTW (17.0) 1930
    Visual Studio 2022 versão 17.1 1931
    Visual Studio 2022 versão 17.2 1932
    Visual Studio 2022 versão 17.3 1933
    Visual Studio 2022 versão 17.4 1934
    Visual Studio 2022 versão 17.5 1935

    Para testar versões ou atualizações do compilador em uma determinada versão do Visual Studio ou depois, use o operador >=. Você pode usá-lo em uma diretiva condicional para comparar _MSC_VER a essa versão conhecida. Caso tenha várias versões mutuamente exclusivas a serem comparadas, solicite suas comparações na ordem decrescente do número de versão. Por exemplo, esse código verifica se há compiladores lançados no Visual Studio 2017 e posterior. Em seguida, ele verifica se há compiladores lançados no Visual Studio 2015 ou depois. Em seguida, ele verifica todos os compiladores lançados antes do Visual Studio 2015:

    #if _MSC_VER >= 1910
    // . . .
    #elif _MSC_VER >= 1900
    // . . .
    #else
    // . . .
    #endif
    

    Para testar versões do compilador que compartilham números principais e secundários, use os números principais, secundários e de build no _MSC_FULL_VER para comparações. Os compiladores no Visual Studio 2019 versão 16.9 têm um valor de _MSC_FULL_VER de 192829500 ou superior. Os compiladores no Visual Studio 2019 versão 16.11 têm um valor de _MSC_FULL_VER de 192930100 ou superior.

    Para obter mais informações, confira Versão do compilador do Visual C++ no Blog da Equipe do Microsoft C++.

  • _MSVC_LANG Definida como um literal inteiro que especifica o padrão de linguagem C++ direcionado pelo compilador. Ela é definida apenas no código compilado como C++. A macro é o valor literal inteiro 201402L por padrão ou quando a opção do compilador /std:c++14 for especificada. A macro será definida como 201703L se a opção do compilador /std:c++17 for especificada. A macro será definida como 202002L se a opção do compilador /std:c++20 for especificada. Ela é definida como um valor mais alto e não especificado quando a opção /std:c++latest estiver especificada. Caso contrário, a macro será indefinida. A macro _MSVC_LANG e as opções do compilador /std (Especificar versão padrão do idioma) estão disponíveis a partir da do Visual Studio 2015 atualização 3.

  • __MSVC_RUNTIME_CHECKS Definida como 1 quando uma das opções do compilador /RTC estiver definida. Caso contrário, é indefinido.

  • _MSVC_TRADITIONAL:

    • Disponível a partir do Visual Studio 2017 versão 15.8: definida como 0 quando a opção do compilador /experimental:preprocessor do modo de conformidade do pré-processador estiver definida. Definida como 1 por padrão ou quando a opção do compilador /experimental:preprocessor- estiver definida, para indicar que o pré-processador tradicional está em uso.
    • Disponível a partir do Visual Studio 2019 versão 16.5: definida como 0 quando a opção do compilador /Zc:preprocessor do modo de conformidade do pré-processador estiver definida. Definida como 1 por padrão ou quando a opção do compilador /Zc:preprocessor- estiver definida, para indicar que o pré-processador tradicional está em uso (basicamente, /Zc:preprocessor substitui a /experimental:preprocessor preterida).
    #if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
    // Logic using the traditional preprocessor
    #else
    // Logic using cross-platform compatible preprocessor
    #endif
    
  • _MT Definida como 1 quando /MD ou /MDd (DLL com multithreaded) ou /MT ou /MTd (com multithreaded) estiver especificada. Caso contrário, é indefinido.

  • _NATIVE_WCHAR_T_DEFINED Definida como 1 quando a opção do compilador /Zc:wchar_t estiver definida. Caso contrário, é indefinido.

  • _OPENMP Definida como literal inteiro 200203, se a opção do compilador /openmp (Habilitar Suporte ao OpenMP 2.0) estiver definida. Esse valor representa a data da especificação de OpenMP implementada pelo MSVC. Caso contrário, é indefinido.

    // _OPENMP_dir.cpp
    // compile with: /openmp
    #include <stdio.h>
    int main() {
        printf("%d\n", _OPENMP);
    }
    
  • _PREFAST_ Definida como 1 quando a opção do compilador /analyze estiver definida. Caso contrário, é indefinido.

  • __SANITIZE_ADDRESS__ Disponível a partir do Visual Studio 2019 versão 16.9. Definida como 1 quando a opção do compilador /fsanitize=address estiver definida. Caso contrário, é indefinido.

  • __TIMESTAMP__ Definida como um literal de cadeia de caracteres que contém a data e a hora da última modificação do arquivo de origem atual, no formulário abreviado de comprimento constante retornado pela função CRT asctime, por exemplo, Fri 19 Aug 13:32:58 2016. Essa macro está sempre definida.

  • _VC_NODEFAULTLIB Definida como 1 quando a opção do compilador /Zl (Omitir nome da biblioteca padrão) estiver definida. Caso contrário, é indefinido.

  • _WCHAR_T_DEFINED Definida como 1 quando a opção do compilador /Zc:wchar_t padrão estiver definida. A macro _WCHAR_T_DEFINED é definida, mas não tem valor se a opção do compilador /Zc:wchar_t- estiver definida e wchar_t for definida em um arquivo de cabeçalho do sistema incluído no projeto. Caso contrário, é indefinido.

  • _WIN32 Definida como 1 quando o destino de compilação for ARM de 32 bits, ARM de 64 bits, x86 ou x64. Caso contrário, é indefinido.

  • _WIN64 Definida como 1 quando o destino de compilação for ARM de 64 bits ou x64. Caso contrário, é indefinido.

  • _WINRT_DLLDefinida como 1 quando compilada como C++ e ambas as opções do compilador /ZW (compilação do Windows Runtime) e /LD ou /LDd estiverem definidas. Caso contrário, é indefinido.

Nenhuma macro de pré-processador que identifique a versão da biblioteca ATL ou MFC está predefinida pelo compilador. Os cabeçalhos da biblioteca ATL e MFC definem essas macros de versão internamente. Eles ficam indefinidos nas diretivas do pré-processador feitas antes que o cabeçalho necessário seja incluído.

  • _ATL_VER Definida em <atldef.h> como um literal inteiro que codifica o número de versão da ATL.

  • _MFC_VER Definida em <afxver_.h> como um literal inteiro que codifica o número de versão da MFC.

Confira também

Macros (C/C++)
Operadores do pré-processador
Diretivas do pré-processador