Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O compilador Microsoft C/C++ (MSVC) predefine determinadas macros de pré-processador, dependendo da linguagem (C ou C++), do destino da compilação e das opções do 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 definido, o pré-processador expande as macros com seus valores especificados 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 dechar.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.
__cplusplusDefinida 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 dessa macro pode ser alterado usando uma#linediretiva. 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/Zaestiver especificada. A partir do Visual Studio 2022 versão 17.2, ele é definido como 1 quando compilado como C e se a opção do/Zc:__STDC__compilador for 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/stdC11 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/stdC11 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/stdC11 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/stdC11 ou C17 estiver especificada.__STDC_VERSION__Definida quando compilada como C e uma das opções/stdC11 ou C17 estiver especificada. Ela se expande como201112Lpara/std:c11e como201710Lpara/std:c17.__STDCPP_DEFAULT_NEW_ALIGNMENT__Quando/std:c17ou mais recente for especificado, essa macro se expandirá para um literalsize_tque tem o valor do alinhamento garantido por uma chamada paraoperator newsem reconhecimento de alinhamento. Alinhamentos maiores são passados para uma sobrecarga com reconhecimento de alinhamento, comooperator 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 outras macros predefinidas:
__ARM_ARCHDefinido como um literal inteiro que representa a versão da arquitetura do ARM. O valor é definido como 8 para a arquitetura Armv8-A. Para 8.1 e posteriores, o valor é dimensionado para versões secundárias, como X.Y, usando a fórmula X * 100 + Y, conforme definido pela extensão de linguagem ARM C. Por exemplo, para Armv8.1,__ARM_ARCHé 8 * 100 + 1 ou 801. Para definir a versão da arquitetura do ARM, consulte/arch (ARM64). Essa macro foi introduzida no Visual Studio 2022 versão 17.10.__ATOM__Definida como 1 quando a opção do compilador/favor:ATOMestiver definida e o destino do compilador for x86 ou x64. Caso contrário, é indefinido.__AVX__Definido como 1 quando as/arch:AVXopções , ,/arch:AVX2/arch:AVX512ou/arch:AVX10.1/arch:AVX10.2compilador 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,/arch:AVX512ou/arch:AVX10.1/arch:AVX10.2compilador é definida e o destino do compilador é x86 ou x64. Caso contrário, é indefinido.__AVX512BW__Definido como 1 quando a opção/arch:AVX512,/arch:AVX10.1ou/arch:AVX10.2compilador é definida e o destino do compilador é x86 ou x64. Caso contrário, é indefinido.__AVX512CD__Definido como 1 quando a opção/arch:AVX512,/arch:AVX10.1ou/arch:AVX10.2compilador é definida e o destino do compilador é x86 ou x64. Caso contrário, é indefinido.__AVX512DQ__Definido como 1 quando a opção/arch:AVX512,/arch:AVX10.1ou/arch:AVX10.2compilador é definida e o destino do compilador é x86 ou x64. Caso contrário, é indefinido.__AVX512F__Definido como 1 quando a opção/arch:AVX512,/arch:AVX10.1ou/arch:AVX10.2compilador é definida e o destino do compilador é x86 ou x64. Caso contrário, é indefinido.__AVX512VL__Definido como 1 quando a opção/arch:AVX512,/arch:AVX10.1ou/arch:AVX10.2compilador é definida e o destino do compilador é x86 ou x64. Caso contrário, é indefinido.__AVX10_VER__Definido como um inteiro que representa a versão do AVX10 quando a opção/arch:AVX10.1ou/arch:AVX10.2compilador é definida e o destino do compilador é x86 ou x64. Caso contrário, é indefinido._CHAR_UNSIGNEDDefinida como 1 se o tipo padrãocharnã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_VERDefinida como um literal inteiro que representa a versão do CLR (Common Language Runtime) usado para compilar o aplicativo. O valor é codificado no formulárioMmmbbbbb, em queMé a versão principal do runtime,mmé a versão secundária do runtime, ebbbbbé o número de build.__CLR_VERserá 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_GUARDDefinida 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 é incrementado em 1 toda vez 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 está sempre definida.Este exemplo usa
__COUNTER__para atribuir identificadores exclusivos para três objetos diferentes do mesmo tipo. O construtorexampleClassaceita um inteiro como um parâmetro. Emmain, o aplicativo declara três objetos do tipoexampleClass, 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_cliDefinida como o valor literal inteiro 200406 quando compilada como C++ e uma opção do compilador/clrestiver 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._CPPRTTIDefinida 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._DEBUGDefinida como 1 quando a opção do compilador/LDd,/MDdou/MTdestiver definida. Caso contrário, é indefinido._DLLDefinida como 1 quando a opção do compilador/MDou/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/EPou/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/EPou/P. Quando compilada para um destino de 64 bits, a convenção de chamada é__cdeclpor 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/EPou/P. Para obter um exemplo de uso, confira a macro__FUNCDNAME__._INTEGRAL_MAX_BITSDefinido 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_VOLATILEDefinida como 1 se a opção do compilador/volatile:isoestiver definida. Caso contrário, é indefinido._KERNEL_MODEDefinida como 1 se a opção do compilador/kernel(Criar binário do modo Kernel) estiver definida. Caso contrário, é indefinido._M_AMD64Definido como o valor literal inteiro 100 para compilações direcionadas a processadores x64 ou ARM64EC. Caso contrário, é indefinido._M_ARMDefinida como o valor literal inteiro 7 para compilações direcionadas a processadores ARM. Indefinido para ARM64, ARM64EC e outros destinos._M_ARM_ARMV7VEDefinida como 1 quando a opção do compilador/arch:ARMv7VEestiver definida para compilações direcionadas a processadores ARM. Caso contrário, é indefinido._M_ARM_FPDefinida como um valor literal inteiro que indica qual opção do compilador/archfoi definida para destinos de processador ARM. Caso contrário, é indefinido.Um valor no intervalo 30-39, se nenhuma opção ARM
/archtiver sido especificada, indicando que a arquitetura padrão para ARM foi definida (VFPv3).Um valor no intervalo de 40 a 49 se
/arch:VFPv4estiver definido.Para obter mais informações, confira
/arch(ARM).
_M_ARM64Definido como 1 para compilações direcionadas ao ARM64. Caso contrário, é indefinido._M_ARM64ECDefinido como 1 para compilações direcionadas ao ARM64EC. Caso contrário, é indefinido._M_CEEDefinida como 001 se alguma opção do compilador/clr(Compilação Common Language Runtime) estiver definida. Caso contrário, é indefinido._M_CEE_PUREPreterida a partir do Visual Studio 2015. Definida como 001 se a opção do compilador/clr:pureestiver definida. Caso contrário, é indefinido._M_CEE_SAFEPreterida a partir do Visual Studio 2015. Definida como 001 se a opção do compilador/clr:safeestiver definida. Caso contrário, é indefinido._M_FP_CONTRACTDisponível a partir do Visual Studio 2022. Definida como 1 se a opção do compilador/fp:contractou/fp:fastestiver definida. Caso contrário, é indefinido._M_FP_EXCEPTDefinida como 1 se a opção do compilador/fp:exceptou/fp:strictestiver definida. Caso contrário, é indefinido._M_FP_FASTDefinida como 1 se a opção do compilador/fp:fastestiver definida. Caso contrário, é indefinido._M_FP_PRECISEDefinida como 1 se a opção do compilador/fp:preciseestiver definida. Caso contrário, é indefinido._M_FP_STRICTDefinida como 1 se a opção do compilador/fp:strictestiver definida. Caso contrário, é indefinido._M_IX86Definida 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_FPDefinida como um valor literal inteiro que indica a opção do compilador/archque 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:IA32estiver definida.1 se a opção do compilador
/arch:SSEestiver definida.2 se a opção
/arch:SSE2,/arch:AVX,/arch:AVX2,/arch:AVX512,/arch:AVX10.1ou/arch:AVX10.2compilador foi definida. Esse valor será o padrão se uma opção do compilador/archnão tiver sido especificada. Quando/arch:AVXfor especificada, a macro__AVX__também será definida. Quando/arch:AVX2for especificada, tanto__AVX__quanto__AVX2__também serão definidas. Quando/arch:AVX512for especificada,__AVX__,__AVX2__,__AVX512BW__,__AVX512CD__,__AVX512DQ__,__AVX512F__e__AVX512VL__também serão definidas. Quando/arch:AVX10.1ou/arch:AVX10.2é especificado,__AVX__, ,__AVX2__,__AVX512BW____AVX512CD__, ,__AVX512DQ____AVX512F____AVX512VL__e__AVX10_VER__também são definidos.Para obter mais informações, confira
/arch(x86).
_M_X64Definido como o valor literal inteiro 100 para compilações direcionadas a processadores x64 ou ARM64EC. Caso contrário, é indefinido._MANAGEDDefinida como 1 quando a opção do compilador/clrestiver definida. Caso contrário, é indefinido._MSC_BUILDDefinida 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 último elemento do número de versão delimitado por período. Por exemplo, se o número de versão do compilador Microsoft C/C++ for 15.00.20706.01, a_MSC_BUILDmacro será 1. Essa macro está sempre definida._MSC_EXTENSIONSDefinida 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_VERDefinida 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 a versão do compilador do Microsoft C/C++ for 19.39.33519,
_MSC_FULL_VERserá 193933519. Insiracl /?na linha de comando para exibir o número de versão do compilador. Essa macro está sempre definida. Para obter mais informações sobre o controle de versão do compilador, consulte Controle de versão do compilador C++ e, especificamente , Versões de serviço começando com o Visual Studio 2017 para obter mais informações sobre o Visual Studio 2019 16.8, 16.9, 16.10 e 16.11, que exigem_MSC_FULL_VERdiferenciá-los._MSC_VERDefinida 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 Microsoft C/C++ for 17.00.51106.1, o valor de_MSC_VERserá 1700. Insiracl /?na linha de comando para exibir o número de versão do compilador. Essa macro está sempre definida.Para testar versões ou atualizações do compilador em uma determinada versão do Visual Studio ou posterior, use o
>=operador. Você pode usá-lo em uma diretiva condicional para comparar_MSC_VERa 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 // . . . #endifPara obter mais informações sobre o Visual Studio 2019 16.8 e 16.9 e 16.10 e 16.11, que compartilham as mesmas versões principais e secundárias (e, portanto, têm o mesmo valor para
_MSC_VER), consulte Versões de serviço a partir do Visual Studio 2017.Para obter mais informações sobre o histórico de controle de versão do compilador e os números de versão do compilador e as versões do Visual Studio às quais eles correspondem, consulte Controle de versão do compilador C++. Além disso, Versão do Compilador do Visual C++ no blog da equipe do Microsoft C++.
_MSVC_LANGDefinida como um literal inteiro que especifica o padrão de linguagem C++ direcionado pelo compilador. Somente o código compilado como C++ o define. A macro é o valor literal inteiro201402Lpor padrão ou quando a opção do compilador/std:c++14for especificada. A macro será definida como201703Lse a opção do compilador/std:c++17for especificada. A macro será definida como202002Lse a opção do compilador/std:c++20for especificada. Ela é definida como um valor mais alto e não especificado quando a opção/std:c++latestestiver especificada. Caso contrário, a macro será indefinida. A macro_MSVC_LANGe 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_CHECKSDefinida como 1 quando uma das opções do compilador/RTCestiver 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:preprocessordo 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:preprocessordo 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:preprocessorsubstitui a/experimental:preprocessorpreterida).
#if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL // Logic using the traditional preprocessor #else // Logic using cross-platform compatible preprocessor #endif- Disponível a partir do Visual Studio 2017 versão 15.8: definida como 0 quando a opção do compilador
_MTDefinida como 1 quando/MDou/MDd(DLL com multithreaded) ou/MTou/MTd(com multithreaded) estiver especificada. Caso contrário, é indefinido._NATIVE_WCHAR_T_DEFINEDDefinida como 1 quando a opção do compilador/Zc:wchar_testiver definida. Caso contrário, é indefinido._OPENMPDefinida 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/analyzeestiver 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=addressestiver 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 CRTasctime, por exemplo,Fri 19 Aug 13:32:58 2016. Essa macro está sempre definida._VC_NODEFAULTLIBDefinida como 1 quando a opção do compilador/Zl(Omitir nome da biblioteca padrão) estiver definida. Caso contrário, é indefinido._WCHAR_T_DEFINEDDefinida como 1 quando a opção do compilador/Zc:wchar_tpadrã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 ewchar_tfor definida em um arquivo de cabeçalho do sistema incluído no projeto. Caso contrário, é indefinido._WIN32Definido como 1 quando o destino da compilação é ARM de 32 bits, ARM de 64 bits, x86, x64 ou ARM64EC. Caso contrário, é indefinido._WIN64Definido como 1 quando o destino da compilação é ARM de 64 bits, x64 ou ARM64EC. 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/LDou/LDdestiverem 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_VERDefinido como<atldef.h>um literal inteiro que codifica o número de versão da ATL._MFC_VERDefinido como<afxver_.h>um literal inteiro que codifica o número de versão do MFC.
Confira também
Macros (C/C++)
Operadores de pré-processador
Diretivas de pré-processador