Macros predefinidas

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

MSVC dá suporte às macros predefinidas do pré-processador exigidas pelos padrões ANSI/ISO C99, C11 e C17 e os padrões 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 build específicos ou opções do compilador. Exceto quando observado, as macros são definidas em uma unidade de tradução como se fossem especificadas como /D argumentos de opção do compilador. 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 por ISO C99 e ISO C++11.

  • __func__ O nome não qualificado e não adornado da função de entrelimpamento como uma matriz const estática 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 pelos padrões ISO C99, C11, C17 e ISO C++17.

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

  • __DATE__ A data de compilação do arquivo de origem atual. A data é um literal de cadeia de caracteres de comprimento constante do formulário Mmm dd yyyyy. O nome do mês Mmm é o mesmo que o nome abreviado do mês gerado pela função de asctime CRT (Biblioteca de Runtime C). O primeiro caractere de data dd será um espaço se o valor for menor que 10. Essa macro é 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 é sempre definida.

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

  • __STDC__ Definido como 1 quando compilado como C e se a opção do /Za compilador for especificada. A partir do Visual Studio versão 17.2 de 2022, ele também é definido como 1 quando compilado como C e se a opção /std:c11 ou /std:c17 compilador for especificada. Caso contrário, indefinido.

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

  • __STDC_NO_ATOMICS__ Definido como 1 se a implementação não dá suporte a atômicos padrão opcionais. A implementação MSVC define-a /std como 1 quando compilada como C e uma das opções C11 ou C17 é especificada.

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

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

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

  • __STDC_VERSION__ Definido quando compilado como C e uma das /std opções C11 ou C17 é especificado. Ele se expande para 201112L , /std:c11e 201710L para /std:c17.

  • __STDCPP_THREADS__ Definido 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 de asctime CRT. Essa macro é sempre definida.

Macros predefinidas específicas da Microsoft

MSVC dá suporte a essas macros predefinidas adicionais.

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

  • __AVX__ Definido como 1 quando as /arch:AVXopções , /arch:AVX2ou /arch:AVX512 compilador são definidas e o destino do compilador é x86 ou x64. Caso contrário, indefinido.

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

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

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

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

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

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

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

  • __CLR_VER Definido 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, onde M está a versão principal do runtime, mm é a versão secundária do runtime e bbbbb é o número de build. __CLR_VER será definido se a opção do /clr compilador estiver definida. Caso contrário, indefinido.

    // clr_ver.cpp
    // compile with: /clr
    using namespace System;
    int main() {
       Console::WriteLine(__CLR_VER);
    }
    
  • _CONTROL_FLOW_GUARDDefinido como 1 quando a opção /guard:cf do compilador (Habilitar Controle Flow Guard) está definida. Caso contrário, indefinido.

  • __COUNTER__ Expande para um literal inteiro que começa em 0. O valor é incrementado por 1 sempre que é 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 é sempre definida.

    Este exemplo usa para atribuir identificadores exclusivos __COUNTER__ a três objetos diferentes do mesmo tipo. O exampleClass construtor usa um inteiro como um parâmetro. Em main, o aplicativo declara três objetos de tipo exampleClass, usando __COUNTER__ como o parâmetro de 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 Definido como o valor literal inteiro 200406 quando compilado como C++ e uma /clr opção de compilador é definida. Caso contrário, indefinido. Quando definido, __cplusplus_cli está em vigor 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_winrtDefinido como o valor literal inteiro 201009 quando compilado como C++ e a opção /ZW do compilador (Windows Runtime Compilação) é definida. Caso contrário, indefinido.

  • _CPPRTTI Definido como 1 se a opção /GR do compilador (Habilitar informações de tipo Run-Time) estiver definida. Caso contrário, indefinido.

  • _CPPUNWIND Definido como 1 se uma ou mais opções do /GX compilador (Habilitar Tratamento de Exceções), /clr (Compilação common language runtime) ou /EH (Modelo de Tratamento de Exceções) estiverem definidas. Caso contrário, indefinido.

  • _DEBUG Definido como 1 quando a opção /LDd, /MDdou /MTd compilador é definida. Caso contrário, indefinido.

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

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

    Este exemplo usa as macros e __FUNCTION__ , __FUNCDNAME____FUNCSIG__para exibir informações da 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__ Definido como um literal de cadeia de caracteres que contém a assinatura da função de colocação. A macro é definida somente dentro de uma função. A __FUNCSIG__ macro não será expandida se você usar a opção /EP ou /P compilador. Quando compilado para um destino de 64 bits, a convenção de chamada é __cdecl por padrão. Para obter um exemplo de uso, consulte a __FUNCDNAME__ macro.

  • __FUNCTION__ Definido como um literal de cadeia de caracteres que contém o nome não cortizado da função de conexão. A macro é definida somente dentro de uma função. A __FUNCTION__ macro não será expandida se você usar a opção /EP ou /P compilador. Para obter um exemplo de uso, consulte a __FUNCDNAME__ macro.

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

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

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

  • _KERNEL_MODE Definido como 1 se a opção /kernel do compilador (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. Caso contrário, indefinido.

  • _M_ARM Definido como o valor literal inteiro 7 para compilações direcionadas a processadores ARM. Caso contrário, indefinido.

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

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

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

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

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

  • _M_ARM64 Definido como 1 para compilações direcionadas a processadores ARM de 64 bits. Caso contrário, indefinido.

  • _M_CEE Definido como 001 se qualquer /clr opção do compilador (Common Language Runtime Compilation) estiver definida. Caso contrário, indefinido.

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

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

  • _M_FP_CONTRACTDisponível a partir de Visual Studio 2022. Definido como 1 se a opção /fp:contract ou /fp:fast compilador estiver definida. Caso contrário, indefinido.

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

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

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

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

  • _M_IX86 Definido 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 Definido como um valor literal inteiro que indica a opção do /arch compilador que foi definida ou o padrão. Essa macro sempre é definida quando o destino da compilação é um processador x86. Caso contrário, indefinido. Quando definido, o valor é:

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

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

    • 2 se a opção /arch:SSE2, /arch:AVXou /arch:AVX2/arch:AVX512 compilador foi definida. Esse valor será o padrão se uma /arch opção do compilador não tiver sido especificada. Quando /arch:AVX é especificada, a macro __AVX__ também é definida. Quando /arch:AVX2 é especificado, ambos __AVX__ e __AVX2__ também são definidos. Quando /arch:AVX512 é especificado, __AVX__, , __AVX2____AVX512BW__, __AVX512CD__, , __AVX512DQ__e __AVX512F____AVX512VL__ também são definidos.

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

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

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

  • _MSC_BUILD Definido como um literal inteiro que contém o elemento de 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 pelo período. Por exemplo, se o número de versão do compilador do Microsoft C/C++ for 15.00.20706.01, a _MSC_BUILD macro será avaliada como 1. Essa macro é sempre definida.

  • _MSC_EXTENSIONS Definido como 1 se a opção do compilador on-by-default /Ze (Habilitar Extensões de Linguagem) estiver definida. Caso contrário, indefinido.

  • _MSC_FULL_VER Definido 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 período, o número menor é o segundo elemento e o número de build é o terceiro elemento. Por exemplo, se o número de versão do compilador do Microsoft C/C++ for 15.00.20706.01, a _MSC_FULL_VER macro será avaliada como 150020706. Insira cl /? na linha de comando para exibir o número de versão do compilador. Essa macro é sempre definida.

  • _MSC_VER Definido como um literal inteiro que codifica os elementos de número principal e menor do número de versão do compilador. O número principal é o primeiro elemento do número de versão delimitado por período e o número menor é o segundo elemento. Por exemplo, se o número de versão do compilador do Microsoft C/C++ for 17.00.51106.1, a _MSC_VER macro será avaliada como 1700. Insira cl /? na linha de comando para exibir o número de versão do compilador. Essa macro é 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 RTW 2017 (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 RTW 2019 (16.0) 1920
    Visual Studio 2019 versão 16.1 1921
    Visual Studio 2019 versão 16.2 1922
    Visual Studio versão 16.3 de 2019 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 RTW 2022 (17.0) 1930
    Visual Studio versão 17.1 de 2022 1931
    Visual Studio 2022 versão 17.2 1932

    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 com essa versão conhecida. Se você tiver 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 dentro ou após Visual Studio 2015. Em seguida, ele verifica todos os compiladores lançados antes de 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 menores, use os números principais, secundários _MSC_FULL_VER e de build para comparações. Os compiladores no Visual Studio versão 16.9 de 2019 têm um _MSC_FULL_VER valor de 192829500 ou superior. Os compiladores no Visual Studio versão 16.11 de 2019 têm um _MSC_FULL_VER valor de 192930100 ou superior.

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

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

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

  • _MSVC_TRADITIONAL:

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

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

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

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

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

  • __TIMESTAMP__ Definido 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 é sempre definida.

  • _VC_NODEFAULTLIB Definido como 1 quando a opção /Zl do compilador (Omitir Nome da Biblioteca Padrão) está definida. Caso contrário, indefinido.

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

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

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

  • _WINRT_DLLDefinido como 1 quando compilado como C++ e ambas /ZW (compilação de Windows Runtime) e /LD ou /LDd opções do compilador são definidas. Caso contrário, indefinido.

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

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

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

Confira também

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