Wstępnie zdefiniowane makra
Kompilator Microsoft C/C++ (MSVC) wstępnie zdefiniowane niektóre makra preprocesora w zależności od języka (C lub C++), celu kompilacji i wybranych opcji kompilatora.
MSVC obsługuje wstępnie zdefiniowane makra preprocesora wymagane przez standardy ANSI/ISO C99, C11 i C17 oraz standardy ISO C++14, C++17 i C++20. Implementacja obsługuje również kilka makr preprocesora specyficznych dla firmy Microsoft.
Niektóre makra są definiowane tylko dla określonych środowisk kompilacji lub opcji kompilatora. Z wyjątkiem przypadków, w których zanotowano, makra są definiowane w całej jednostce tłumaczenia tak, jakby zostały określone jako /D
argumenty opcji kompilatora. Po zdefiniowaniu preprocesor rozszerza makra określone wartości przed kompilacją. Wstępnie zdefiniowane makra nie przyjmują żadnych argumentów i nie można ich ponownie zdefiniować.
Identyfikator wstępnie zdefiniowany w warstwie Standardowa
Kompilator obsługuje ten wstępnie zdefiniowany identyfikator określony przez iso C99 i ISO C++11.
__func__
Niekwalifikowana i niewielęgodna nazwa otaczającej funkcji jako statyczna tablica const funkcji lokalnej klasychar
.void example() { printf("%s\n", __func__); } // prints "example"
Standardowe wstępnie zdefiniowane makra
Kompilator obsługuje te wstępnie zdefiniowane makra określone przez standardy ISO C99, C11, C17 i ISO C++17.
__cplusplus
Zdefiniowano jako wartość literału liczby całkowitej, gdy jednostka tłumaczenia jest kompilowana jako C++. W przeciwnym razie niezdefiniowane.__DATE__
Data kompilacji bieżącego pliku źródłowego. Data to literał ciągu o stałej długości formularza Mmm dd rrrr. Nazwa miesiąca Mmm jest taka sama jak skrócona nazwa miesiąca wygenerowana przez funkcję asctime biblioteki środowiska uruchomieniowego języka C (CRT). Pierwszy znak daty dd to spacja, jeśli wartość jest mniejsza niż 10. To makro jest zawsze zdefiniowane.__FILE__
Nazwa bieżącego pliku źródłowego.__FILE__
rozwija się do literału ciągu znaków. Aby upewnić się, że zostanie wyświetlona pełna ścieżka do pliku, użyj opcji/FC
(Pełna ścieżka pliku kodu źródłowego w diagnostyce). To makro jest zawsze zdefiniowane.__LINE__
Zdefiniowano jako numer wiersza liczby całkowitej w bieżącym pliku źródłowym. Wartość tego makra można zmienić przy użyciu#line
dyrektywy . Całkowity typ wartości__LINE__
może się różnić w zależności od kontekstu. To makro jest zawsze zdefiniowane.__STDC__
Zdefiniowano jako 1 podczas kompilowania jako C i jeśli określono opcję kompilatora/Za
. Począwszy od programu Visual Studio 2022 w wersji 17.2, jest on zdefiniowany jako 1, gdy jest kompilowany jako C i czy/std:c11
określono opcję kompilatora lub/std:c17
. W przeciwnym razie niezdefiniowane.__STDC_HOSTED__
Zdefiniowana jako 1, jeśli implementacja jest implementacją hostowaną, która obsługuje całą wymaganą bibliotekę standardową. W przeciwnym razie zdefiniowano wartość 0.__STDC_NO_ATOMICS__
Zdefiniowana jako 1, jeśli implementacja nie obsługuje opcjonalnych niepodzielnych standardowych elementów niepodzielnych. Implementacja MSVC definiuje ją jako 1 podczas kompilowania jako C i określono jedną z/std
opcji C11 lub C17.__STDC_NO_COMPLEX__
Zdefiniowana jako 1, jeśli implementacja nie obsługuje opcjonalnych standardowych liczb zespolonych. Implementacja MSVC definiuje ją jako 1 podczas kompilowania jako C i określono jedną z/std
opcji C11 lub C17.__STDC_NO_THREADS__
Zdefiniowana jako 1, jeśli implementacja nie obsługuje opcjonalnych standardowych wątków. Implementacja MSVC definiuje ją jako 1 podczas kompilowania jako C i określono jedną z/std
opcji C11 lub C17.__STDC_NO_VLA__
Zdefiniowana jako 1, jeśli implementacja nie obsługuje standardowych tablic o zmiennej długości. Implementacja MSVC definiuje ją jako 1 podczas kompilowania jako C i określono jedną z/std
opcji C11 lub C17.__STDC_VERSION__
Zdefiniowane podczas kompilowania jako C i jednej z/std
opcji C11 lub C17 jest określony. Jest on rozszerzany do201112L
dla/std:c11
, i201710L
dla/std:c17
.__STDCPP_DEFAULT_NEW_ALIGNMENT__
Gdy/std:c17
zostanie określone lub nowsze, to makro rozszerza się nasize_t
literał, który ma wartość wyrównania gwarantowane przez wywołanie do wyrównania nieświadomeoperator new
. Większe wyrównania są przekazywane do przeciążenia obsługującego wyrównanie, takiego jakoperator new(std::size_t, std::align_val_t)
. Aby uzyskać więcej informacji, zobacz/Zc:alignedNew
(Alokacja wyrównana nadmiernie w języku C++17).__STDCPP_THREADS__
Zdefiniowano jako 1, jeśli i tylko wtedy, gdy program może mieć więcej niż jeden wątek wykonywania i skompilowany jako C++. W przeciwnym razie niezdefiniowane.__TIME__
Czas tłumaczenia wstępnie przetworzonej jednostki tłumaczenia. Czas to literał ciągu znaków formularza hh:mm:ss, taki sam jak czas zwracany przez funkcję asctime CRT. To makro jest zawsze zdefiniowane.
Wstępnie zdefiniowane makra specyficzne dla firmy Microsoft
Program MSVC obsługuje inne wstępnie zdefiniowane makra:
__ARM_ARCH
Zdefiniowano jako literał liczb całkowitych reprezentujący wersję architektury usługi ARM. Wartość jest zdefiniowana jako 8 dla architektury Armv8-A. W przypadku wersji 8.1 i nowszych wartość jest skalowana dla wersji pomocniczych, takich jak X.Y, przy użyciu formuły X * 100 + Y zgodnie z definicją rozszerzenia języka ARM C. Na przykład w przypadku armv8.1__ARM_ARCH
wartość to 8 * 100 + 1 lub 801. Aby ustawić wersję architektury usługi ARM, zobacz/arch (ARM64)
. To makro zostało wprowadzone w programie Visual Studio 2022 w wersji 17.10.__ATOM__
Zdefiniowana jako 1, gdy jest ustawiona/favor:ATOM
opcja kompilatora, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.__AVX__
Zdefiniowane jako 1, gdy/arch:AVX
są ustawione opcje ,/arch:AVX2
/arch:AVX512
lub/arch:AVX10.1
kompilatora, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.__AVX2__
Zdefiniowana jako 1, gdy jest ustawiona/arch:AVX2
opcja ,/arch:AVX512
lub/arch:AVX10.1
kompilatora, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.__AVX512BW__
Zdefiniowano jako 1, gdy jest ustawiona/arch:AVX512
opcja kompilatora lub/arch:AVX10.1
, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.__AVX512CD__
Zdefiniowano jako 1, gdy jest ustawiona/arch:AVX512
opcja kompilatora lub/arch:AVX10.1
, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.__AVX512DQ__
Zdefiniowano jako 1, gdy jest ustawiona/arch:AVX512
opcja kompilatora lub/arch:AVX10.1
, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.__AVX512F__
Zdefiniowano jako 1, gdy jest ustawiona/arch:AVX512
opcja kompilatora lub/arch:AVX10.1
, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.__AVX512VL__
Zdefiniowano jako 1, gdy jest ustawiona/arch:AVX512
opcja kompilatora lub/arch:AVX10.1
, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.__AVX10_VER__
Zdefiniowano jako liczbę całkowitą reprezentującą wersję avX10, gdy/arch:AVX10.1
jest ustawiona opcja kompilatora, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane._CHAR_UNSIGNED
Zdefiniowano jako 1, jeśli typ domyślnychar
jest niepodpisany. Ta wartość jest definiowana, gdy jest ustawiona opcja kompilatora/J
(domyślny typ znaku jest niepodpisany). W przeciwnym razie niezdefiniowane.__CLR_VER
Zdefiniowano jako literał całkowity reprezentujący wersję środowiska uruchomieniowego języka wspólnego (CLR) używanego do kompilowania aplikacji. Wartość jest kodowana w postaciMmmbbbbb
, gdzieM
jest główną wersją środowiska uruchomieniowego,mm
jest pomocniczą wersją środowiska uruchomieniowego ibbbbb
jest numerem kompilacji.__CLR_VER
jest definiowany, jeśli opcja kompilatora/clr
jest ustawiona. W przeciwnym razie niezdefiniowane.// clr_ver.cpp // compile with: /clr using namespace System; int main() { Console::WriteLine(__CLR_VER); }
_CONTROL_FLOW_GUARD
Zdefiniowana jako 1, gdy jest ustawiona opcja kompilatora/guard:cf
(Włącz funkcję Control Flow Guard). W przeciwnym razie niezdefiniowane.__COUNTER__
Rozwija się do literału liczby całkowitej, który zaczyna się od 0. Wartość zwiększa się o 1 za każdym razem, gdy jest używana w pliku źródłowym lub w dołączonych nagłówkach pliku źródłowego.__COUNTER__
zapamiętuje jego stan podczas używania wstępnie skompilowanych nagłówków. To makro jest zawsze zdefiniowane.W tym przykładzie użyto
__COUNTER__
metody przypisywania unikatowych identyfikatorów do trzech różnych obiektów tego samego typu. KonstruktorexampleClass
przyjmuje liczbę całkowitą jako parametr. Wmain
systemie aplikacja deklaruje trzy obiekty typuexampleClass
, używając__COUNTER__
jako unikatowego parametru identyfikatora:// 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
Zdefiniowana jako wartość literału liczby całkowitej 200406 podczas kompilowania jako C++ i ustawiono opcję kompilatora/clr
. W przeciwnym razie niezdefiniowane. Gdy jest zdefiniowana,__cplusplus_cli
działa w całej jednostce tłumaczenia.// 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
Zdefiniowana jako wartość literału liczby całkowitej 201009 po skompilowaniu jako C++ i/ZW
ustawiono opcję kompilatora (kompilacja środowisko wykonawcze systemu Windows). W przeciwnym razie niezdefiniowane._CPPRTTI
Zdefiniowano jako 1, jeśli jest ustawiona/GR
opcja kompilatora (Włącz informacje o typie czasu wykonywania). W przeciwnym razie niezdefiniowane._CPPUNWIND
Zdefiniowano jako 1, jeśli ustawiono co najmniej jedną/GX
z opcji kompilatora (Włącz obsługę wyjątków),/clr
(kompilacja środowiska uruchomieniowego języka wspólnego) lub/EH
(model obsługi wyjątków). W przeciwnym razie niezdefiniowane._DEBUG
Zdefiniowano jako 1, gdy jest ustawiona/LDd
opcja ,/MDd
lub/MTd
kompilatora. W przeciwnym razie niezdefiniowane._DLL
Zdefiniowane jako 1, gdy jest ustawiona opcja kompilatora/MD
lub/MDd
(wielowątkowa biblioteka DLL). W przeciwnym razie niezdefiniowane.__FUNCDNAME__
Zdefiniowano jako literał ciągu, który zawiera ozdobioną nazwę otaczającej funkcji. Makro jest definiowane tylko w ramach funkcji. Makro__FUNCDNAME__
nie jest rozwinięte, jeśli używasz/EP
opcji lub/P
kompilatora.W tym przykładzie użyto
__FUNCDNAME__
makr ,__FUNCSIG__
i__FUNCTION__
do wyświetlania informacji o funkcji.// 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__
Zdefiniowano jako literał ciągu, który zawiera podpis otaczającej funkcji. Makro jest definiowane tylko w ramach funkcji. Makro__FUNCSIG__
nie jest rozwinięte, jeśli używasz/EP
opcji lub/P
kompilatora. Podczas kompilowania dla obiektu docelowego 64-bitowego konwencja wywoływania jest__cdecl
domyślnie. Przykład użycia można znaleźć w makrze__FUNCDNAME__
.__FUNCTION__
Zdefiniowano jako literał ciągu, który zawiera nieukodowaną nazwę otaczającej funkcji. Makro jest definiowane tylko w ramach funkcji. Makro__FUNCTION__
nie jest rozwinięte, jeśli używasz/EP
opcji lub/P
kompilatora. Przykład użycia można znaleźć w makrze__FUNCDNAME__
._INTEGRAL_MAX_BITS
Zdefiniowano jako wartość literału liczby całkowitej 64, maksymalny rozmiar (w bitach) dla typu całkowitego niewektorowego. To makro jest zawsze zdefiniowane.// integral_max_bits.cpp #include <stdio.h> int main() { printf("%d\n", _INTEGRAL_MAX_BITS); }
__INTELLISENSE__
Zdefiniowano jako 1 podczas przekazywania kompilatora intelliSense w środowisku IDE programu Visual Studio. W przeciwnym razie niezdefiniowane. Tego makra można użyć do ochrony kodu, którego kompilator IntelliSense nie rozumie, lub użyć go do przełączania się między kompilatorem i kompilatorem funkcji IntelliSense. Aby uzyskać więcej informacji, zobacz Porady dotyczące rozwiązywania problemów z powolnym działaniem funkcji IntelliSense._ISO_VOLATILE
Zdefiniowano jako 1, jeśli jest ustawiona opcja kompilatora/volatile:iso
. W przeciwnym razie niezdefiniowane._KERNEL_MODE
Zdefiniowane jako 1, jeśli/kernel
jest ustawiona opcja kompilatora (Utwórz plik binarny trybu jądra). W przeciwnym razie niezdefiniowane._M_AMD64
Zdefiniowano jako wartość literału liczby całkowitej 100 dla kompilacji przeznaczonych dla procesorów x64 lub ARM64EC. W przeciwnym razie niezdefiniowane._M_ARM
Zdefiniowano jako wartość literału liczby całkowitej 7 dla kompilacji przeznaczonych dla procesorów ARM. Niezdefiniowane dla arm64, ARM64EC i innych obiektów docelowych._M_ARM_ARMV7VE
Zdefiniowana jako 1, gdy opcja kompilatora/arch:ARMv7VE
jest ustawiona dla kompilacji przeznaczonych dla procesorów ARM. W przeciwnym razie niezdefiniowane._M_ARM_FP
Zdefiniowano jako wartość literału liczby całkowitej, która wskazuje, która/arch
opcja kompilatora została ustawiona dla celów procesora ARM. W przeciwnym razie niezdefiniowane.Wartość w zakresie od 30 do 39, jeśli nie
/arch
określono opcji ARM, wskazująca domyślną architekturę dla usługi ARM została ustawiona (VFPv3
).Wartość w zakresie 40–49, jeśli
/arch:VFPv4
została ustawiona.Aby uzyskać więcej informacji, zobacz
/arch
(ARM).
_M_ARM64
Zdefiniowano jako 1 dla kompilacji przeznaczonych dla usługi ARM64. W przeciwnym razie niezdefiniowane._M_ARM64EC
Zdefiniowano jako 1 dla kompilacji docelowych ARM64EC. W przeciwnym razie niezdefiniowane._M_CEE
Zdefiniowana jako 001, jeśli jest ustawiona jakakolwiek/clr
opcja kompilatora (kompilacja środowiska uruchomieniowego języka wspólnego). W przeciwnym razie niezdefiniowane._M_CEE_PURE
Przestarzałe począwszy od programu Visual Studio 2015. Zdefiniowana jako 001, jeśli jest ustawiona opcja kompilatora/clr:pure
. W przeciwnym razie niezdefiniowane._M_CEE_SAFE
Przestarzałe począwszy od programu Visual Studio 2015. Zdefiniowana jako 001, jeśli jest ustawiona opcja kompilatora/clr:safe
. W przeciwnym razie niezdefiniowane._M_FP_CONTRACT
Dostępne począwszy od programu Visual Studio 2022. Zdefiniowano jako 1, jeśli/fp:contract
ustawiono opcję kompilatora lub/fp:fast
. W przeciwnym razie niezdefiniowane._M_FP_EXCEPT
Zdefiniowano jako 1, jeśli/fp:except
ustawiono opcję kompilatora lub/fp:strict
. W przeciwnym razie niezdefiniowane._M_FP_FAST
Zdefiniowano jako 1, jeśli jest ustawiona opcja kompilatora/fp:fast
. W przeciwnym razie niezdefiniowane._M_FP_PRECISE
Zdefiniowano jako 1, jeśli jest ustawiona opcja kompilatora/fp:precise
. W przeciwnym razie niezdefiniowane._M_FP_STRICT
Zdefiniowano jako 1, jeśli jest ustawiona opcja kompilatora/fp:strict
. W przeciwnym razie niezdefiniowane._M_IX86
Zdefiniowano jako wartość literału liczby całkowitej 600 dla kompilacji przeznaczonych dla procesorów x86. To makro nie jest zdefiniowane dla elementów docelowych kompilacji x64 ani ARM._M_IX86_FP
Zdefiniowano jako wartość literału liczby całkowitej, która wskazuje/arch
opcję kompilatora, która została ustawiona lub wartość domyślna. To makro jest zawsze definiowane, gdy element docelowy kompilacji jest procesorem x86. W przeciwnym razie niezdefiniowane. Po zdefiniowaniu wartość to:0, jeśli została ustawiona opcja kompilatora
/arch:IA32
.1, jeśli została ustawiona opcja kompilatora
/arch:SSE
.2, jeśli
/arch:SSE2
ustawiono opcję ,/arch:AVX
,/arch:AVX2
/arch:AVX512
lub/arch:AVX10.1
kompilatora. Ta wartość jest wartością domyślną, jeśli/arch
nie określono opcji kompilatora. Po/arch:AVX
określeniu makra__AVX__
jest również definiowane. Gdy/arch:AVX2
jest określony, zarówno, jak__AVX__
i__AVX2__
są również zdefiniowane. Gdy/arch:AVX512
parametr jest określony, ,__AVX512BW__
__AVX512CD__
__AVX2__
__AVX512DQ__
__AVX__
__AVX512F__
i__AVX512VL__
są również zdefiniowane. Gdy/arch:AVX10.1
parametr jest określony, ,__AVX512BW__
__AVX512DQ__
__AVX__
__AVX512CD__
__AVX512F__
__AVX2__
__AVX512VL__
i__AVX10_VER__
są również zdefiniowane.Aby uzyskać więcej informacji, zobacz
/arch
(x86).
_M_X64
Zdefiniowano jako wartość literału liczby całkowitej 100 dla kompilacji przeznaczonych dla procesorów x64 lub ARM64EC. W przeciwnym razie niezdefiniowane._MANAGED
Zdefiniowano jako 1, gdy jest ustawiona opcja kompilatora/clr
. W przeciwnym razie niezdefiniowane._MSC_BUILD
Zdefiniowano jako literał liczb całkowitych, który zawiera element numeru poprawki numeru wersji kompilatora. Numer poprawki to ostatni element rozdzielanego okresem numeru wersji. Jeśli na przykład numer wersji kompilatora Microsoft C/C++ to 15.00.20706.01,_MSC_BUILD
makro to 1. To makro jest zawsze zdefiniowane._MSC_EXTENSIONS
Zdefiniowane jako 1, jeśli jest ustawiona opcja kompilatora on-by-default/Ze
(Włącz rozszerzenia języka). W przeciwnym razie niezdefiniowane._MSC_FULL_VER
Zdefiniowane jako literał liczb całkowitych, który koduje główne, pomocnicze i numer kompilacji elementów numeru wersji kompilatora. Numer główny jest pierwszym elementem rozdzielanego kropkami numeru wersji, numer pomocniczy jest drugim elementem, a numer kompilacji jest trzecim elementem.Jeśli na przykład kompilator Microsoft C/C++ ma wersję 19.39.33519,
_MSC_FULL_VER
jest 193933519. Wprowadźcl /?
w wierszu polecenia, aby wyświetlić numer wersji kompilatora. To makro jest zawsze zdefiniowane. Aby uzyskać więcej informacji na temat przechowywania wersji kompilatora, zobacz Wersje kompilatora języka C++ i wersje usługi począwszy od programu Visual Studio 2017, aby uzyskać więcej informacji na temat programu Visual Studio 2019 16.8, 16.9, 16.10 i 16.11, które wymagają_MSC_FULL_VER
od nich odróżnić._MSC_VER
Zdefiniowano jako literał liczb całkowitych, który koduje główne i pomocnicze elementy numeru wersji kompilatora. Numer główny jest pierwszym elementem rozdzielanego kropkami numeru wersji, a numer pomocniczy jest drugim elementem. Jeśli na przykład numer wersji kompilatora Microsoft C/C++ to 17.00.51106.1, wartość to_MSC_VER
1700. Wprowadźcl /?
w wierszu polecenia, aby wyświetlić numer wersji kompilatora. To makro jest zawsze zdefiniowane.Aby przetestować wersje kompilatora lub aktualizacje w danej wersji programu Visual Studio lub nowszej, użyj
>=
operatora . Można go użyć w dyrektywie warunkowej, aby porównać_MSC_VER
ją ze znaną wersją. Jeśli masz kilka wzajemnie wykluczających się wersji do porównania, porządkuj porównania w kolejności malejącej numeru wersji. Na przykład ten kod sprawdza kompilatory wydane w programie Visual Studio 2017 lub nowszym. Następnie sprawdza, czy kompilatory zostały wydane w programie Visual Studio 2015 lub nowszym. Następnie sprawdza wszystkie kompilatory wydane przed programem Visual Studio 2015:#if _MSC_VER >= 1910 // . . . #elif _MSC_VER >= 1900 // . . . #else // . . . #endif
Aby uzyskać więcej informacji o programach Visual Studio 2019 16.8 i 16.9 oraz 16.10 i 16.11, które współużytkowały te same wersje główne i pomocnicze (i mają taką samą wartość dla
_MSC_VER
programu ), zobacz Wersje usługi, począwszy od programu Visual Studio 2017.Aby uzyskać więcej informacji na temat historii przechowywania wersji kompilatora i numerów wersji kompilatora oraz odpowiadających im wersji programu Visual Studio, zobacz Wersje kompilatora języka C++. Ponadto wersja kompilatora Visual C++ na blogu zespołu microsoft C++.
_MSVC_LANG
Zdefiniowano jako literał całkowity, który określa standard języka C++ przeznaczony dla kompilatora. Ustawiany jest tylko kod skompilowany w języku C++. Makro jest domyślnie wartością201402L
literału liczby całkowitej lub po określeniu opcji kompilatora/std:c++14
. Makro jest ustawione na201703L
wartość , jeśli określono opcję kompilatora/std:c++17
. Makro jest ustawione na202002L
wartość , jeśli określono opcję kompilatora/std:c++20
. Jest ona ustawiona na wyższą, nieokreśloną wartość po określeniu/std:c++latest
opcji. W przeciwnym razie makro jest niezdefiniowane. Opcje kompilatora_MSVC_LANG
makr i/std
(Określ wersję standardową języka) są dostępne począwszy od programu Visual Studio 2015 Update 3.__MSVC_RUNTIME_CHECKS
Zdefiniowano jako 1, gdy ustawiono jedną z opcji kompilatora/RTC
. W przeciwnym razie niezdefiniowane._MSVC_TRADITIONAL
:- Dostępne począwszy od programu Visual Studio 2017 w wersji 15.8: zdefiniowane jako 0 po ustawieniu opcji kompilatora trybu
/experimental:preprocessor
zgodności preprocesora. Zdefiniowana jako 1 domyślnie lub gdy/experimental:preprocessor-
jest ustawiona opcja kompilatora, aby wskazać, że jest używany tradycyjny preprocesor. - Dostępne począwszy od programu Visual Studio 2019 w wersji 16.5: zdefiniowane jako 0 po ustawieniu opcji kompilatora trybu
/Zc:preprocessor
zgodności preprocesora. Zdefiniowane jako 1 domyślnie lub gdy/Zc:preprocessor-
jest ustawiona opcja kompilatora, aby wskazać, że tradycyjny preprocesor jest używany (zasadniczo/Zc:preprocessor
zastępuje przestarzałe/experimental:preprocessor
).
#if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL // Logic using the traditional preprocessor #else // Logic using cross-platform compatible preprocessor #endif
- Dostępne począwszy od programu Visual Studio 2017 w wersji 15.8: zdefiniowane jako 0 po ustawieniu opcji kompilatora trybu
_MT
Zdefiniowano jako 1, gdy/MD
określono lub/MDd
(wielowątkową bibliotekę DLL) lub/MT
/MTd
(wielowątkową). W przeciwnym razie niezdefiniowane._NATIVE_WCHAR_T_DEFINED
Zdefiniowano jako 1, gdy jest ustawiona opcja kompilatora/Zc:wchar_t
. W przeciwnym razie niezdefiniowane._OPENMP
Zdefiniowana jako literał liczby całkowitej 200203, jeśli/openmp
ustawiono opcję kompilatora (Włącz obsługę protokołu OpenMP 2.0). Ta wartość reprezentuje datę specyfikacji OpenMP zaimplementowanej przez MSVC. W przeciwnym razie niezdefiniowane.// _OPENMP_dir.cpp // compile with: /openmp #include <stdio.h> int main() { printf("%d\n", _OPENMP); }
_PREFAST_
Zdefiniowano jako 1, gdy jest ustawiona opcja kompilatora/analyze
. W przeciwnym razie niezdefiniowane.__SANITIZE_ADDRESS__
Dostępne począwszy od programu Visual Studio 2019 w wersji 16.9. Zdefiniowano jako 1, gdy jest ustawiona opcja kompilatora/fsanitize=address
. W przeciwnym razie niezdefiniowane.__TIMESTAMP__
Zdefiniowane jako literał ciągu, który zawiera datę i godzinę ostatniej modyfikacji bieżącego pliku źródłowego, w skróconej postaci stałej długości zwracanej przez funkcję CRTasctime
, na przykładFri 19 Aug 13:32:58 2016
. To makro jest zawsze zdefiniowane._VC_NODEFAULTLIB
Zdefiniowana jako 1, gdy jest ustawiona opcja kompilatora/Zl
(Pomiń domyślną nazwę biblioteki). W przeciwnym razie niezdefiniowane._WCHAR_T_DEFINED
Zdefiniowana jako 1, gdy jest ustawiona domyślna/Zc:wchar_t
opcja kompilatora. Makro_WCHAR_T_DEFINED
jest zdefiniowane, ale nie ma wartości, jeśli/Zc:wchar_t-
jest ustawiona opcja kompilatora iwchar_t
jest definiowana w pliku nagłówka systemu zawartego w projekcie. W przeciwnym razie niezdefiniowane._WIN32
Zdefiniowano jako 1, gdy element docelowy kompilacji to 32-bitowa usługa ARM, 64-bitowa usługa ARM, x86 lub x64. W przeciwnym razie niezdefiniowane._WIN64
Zdefiniowany jako 1, gdy element docelowy kompilacji to 64-bitowa usługa ARM lub x64. W przeciwnym razie niezdefiniowane._WINRT_DLL
Zdefiniowano jako 1 podczas kompilowania jako C++ oraz opcji (kompilacja środowisko wykonawcze systemu Windows) i/LDd
/LD
kompilatora./ZW
W przeciwnym razie niezdefiniowane.
Żadne makra preprocesora identyfikujące wersję biblioteki ATL lub MFC nie są wstępnie zdefiniowane przez kompilator. Nagłówki bibliotek ATL i MFC definiują te makra wersji wewnętrznie. Nie są one zdefiniowane w dyrektywach preprocesora wykonanych przed dołączeniu wymaganego nagłówka.
_ATL_VER
Zdefiniowane jako<atldef.h>
literał liczb całkowitych, który koduje numer wersji ATL._MFC_VER
Zdefiniowane jako<afxver_.h>
literał liczb całkowitych, który koduje numer wersji MFC.