Vordefinierte Makros
Der Microsoft C/C++-Compiler (MSVC) vordefinierte bestimmte Präprozessormakros abhängig von der Sprache (C oder C++), dem Kompilierungsziel und den ausgewählten Compileroptionen.
MSVC unterstützt die vordefinierten Präprozessormakros, die von den Standards ANSI/ISO C99, C11 und C17 und ISO C++14, C++17 und C++20 benötigt werden. Die Implementierung unterstützt auch mehrere weitere Microsoft-spezifische Präprozessormakros.
Einige Makros werden nur für bestimmte Buildumgebungen oder Compileroptionen definiert. Sofern nicht angegeben, werden die Makros über eine Übersetzungseinheit definiert, als ob sie als /D
-Compileroptionsargumente angegeben würden. Wenn definiert, erweitert der Präprozessor makros ihre angegebenen Werte vor der Kompilierung. Von den vordefinierten Makros werden keine Argumente akzeptiert, und sie können nicht neu definiert werden.
Vordefinierter Standardbezeichner
Der Compiler unterstützt diesen vordefinierten Bezeichner, der von ISO C99 und ISO C++11 angegeben wird.
__func__
Dieser Wert gibt den nicht qualifizierten und undekorierten Namen der einschließenden Funktion als funktionslokales static const-Array vonchar
zurück.void example() { printf("%s\n", __func__); } // prints "example"
Vordefinierte Standardmakros
Der Compiler unterstützt diese vordefinierten Makros, die von den ISO-Standards C99, C11 und C17 sowie C++17 angegeben werden.
__cplusplus
Dieser Wert wird als literale ganze Zahl definiert, wenn die Übersetzungseinheit als C++ kompiliert wird. Andernfalls wird er nicht definiert.__DATE__
Bei diesem Wert handelt es sich um das Kompilierungsdatum der aktuellen Quelldatei. Das Datum ist ein Zeichenfolgenliteral im Format Mmm dd yyyy, das eine konstante Länge aufweist. Der Monatsname Mmm entspricht dem abgekürzten Monatsnamen, der von der asctime-Funktion der C-Laufzeitbibliothek (CRT) generiert wurde. Das erste Zeichen des Datums dd ist ein Leerzeichen, wenn der Wert kleiner als 10 ist. Dieses Makro wird immer definiert.__FILE__
Dieser Wert ist der Name der aktuellen Quelldatei.__FILE__
wird zu einem Zeichenfolgenliteral erweitert. Verwenden Sie/FC
(vollständiger Pfad der Quellcodedatei bei Diagnosen), um sicherzustellen, dass der vollständige Dateipfad zur Datei angezeigt wird . Dieses Makro wird immer definiert.__LINE__
Dieses Makro wird als Zeilennummer (ganze Zahl) in der aktuellen Quelldatei definiert. Der Wert dieses Makros kann mithilfe einer#line
Direktive geändert werden. Der integrale Typ des Werts__LINE__
kann je nach Kontext variieren. Dieses Makro wird immer definiert.__STDC__
Definiert als 1, wenn er als C kompiliert wird und wenn die/Za
Compileroption angegeben ist. Ab Visual Studio 2022, Version 17.2, wird sie beim Kompilieren als C als 1 definiert und wenn die/std:c11
/std:c17
Compileroption angegeben ist. Andernfalls wird er nicht definiert.__STDC_HOSTED__
Dieser Wert wird als 1 definiert, wenn es sich bei der Implementierung um eine gehostete Implementierung handelt, die die gesamte erforderliche Standardbibliothek unterstützt. Andernfalls wird er als 0 definiert.__STDC_NO_ATOMICS__
wird als 1 definiert, wenn die Implementierung keine optionalen Standardatomics unterstützt. Die MSVC-Implementierung definiert dies als 1, wenn sie als C kompiliert und eine der/std
-Optionen (C11 oder C17) angegeben wird.__STDC_NO_COMPLEX__
wird als 1 definiert, wenn die Implementierung keine optionalen komplexen Standardzahlen unterstützt. Die MSVC-Implementierung definiert dies als 1, wenn sie als C kompiliert und eine der/std
-Optionen (C11 oder C17) angegeben wird.__STDC_NO_THREADS__
wird als 1 definiert, wenn die Implementierung keine optionalen Standardthreads unterstützt. Die MSVC-Implementierung definiert dies als 1, wenn sie als C kompiliert und eine der/std
-Optionen (C11 oder C17) angegeben wird.__STDC_NO_VLA__
wird als 1 definiert, wenn die Implementierung keine variable Standardlängenarrays unterstützt. Die MSVC-Implementierung definiert dies als 1, wenn sie als C kompiliert und eine der/std
-Optionen (C11 oder C17) angegeben wird.__STDC_VERSION__
wird definiert, wenn das Makro als C kompiliert und eine der/std
-Optionen (C11 oder C17) angegeben wird. Für/std:c11
wird es auf201112L
und für/std:c17
auf201710L
erweitert.__STDCPP_DEFAULT_NEW_ALIGNMENT__
Wenn/std:c17
oder später angegeben wird, wird dieses Makro auf einsize_t
Literal erweitert, das den Wert der Ausrichtung aufweist, die durch einen Aufruf der Ausrichtung garantiert wird.operator new
Größere Ausrichtungen werden an eine Ausrichtungsüberladung übergeben, zoperator new(std::size_t, std::align_val_t)
. B. . Weitere Informationen finden Sie unter/Zc:alignedNew
(C++17 over-aligned allocation).__STDCPP_THREADS__
Dieser Wert wird nur dann als 1 definiert, wenn ein Programm über mehr als einen Ausführungsthread verfügen kann und als C++ kompiliert wird. Andernfalls wird er nicht definiert.__TIME__
Dieser Wert gibt die Zeit der Übersetzung der vorverarbeiteten Übersetzungseinheit an. Bei der Zeit handelt es sich um ein Zeichenfolgenliteral im Format hh:mm:ss, das der von der asctime-Funktion der CRT zurückgegebenen Zeit entspricht. Dieses Makro wird immer definiert.
Microsoft-spezifische vordefinierte Makros
MSVC unterstützt andere vordefinierte Makros:
__ARM_ARCH
Definiert als ganzzahliges Literal, das die ARM-Architekturversion darstellt. Der Wert ist als 8 für die Armv8-A-Architektur definiert. Für 8,1 und höher wird der Wert für Nebenversionen skaliert, z. B. X.Y, indem die Formel X * 100 + Y verwendet wird, wie durch die ARM C-Spracherweiterung definiert. Beispiel: Für Armv8.1__ARM_ARCH
ist 8 * 100 + 1 oder 801. Informationen zum Festlegen der ARM-Architekturversion finden Sie unter/arch (ARM64)
. Dieses Makro wurde in Visual Studio 2022, Version 17.10, eingeführt.__ATOM__
Dieser Wert wird als 1 definiert, wenn die Compileroption/favor:ATOM
festgelegt und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert.__AVX__
Definiert als 1, wenn die/arch:AVX
Compileroptionen/arch:AVX512
/arch:AVX2
/arch:AVX10.1
festgelegt werden und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert.__AVX2__
Definiert als 1, wenn die/arch:AVX2
Compileroption/arch:AVX10.1
/arch:AVX512
festgelegt wird und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert.__AVX512BW__
Dieser Wert wird als 1 definiert, wenn die Compileroption/arch:AVX512
oder/arch:AVX10.1
festgelegt und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert.__AVX512CD__
Dieser Wert wird als 1 definiert, wenn die Compileroption/arch:AVX512
oder/arch:AVX10.1
festgelegt und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert.__AVX512DQ__
Dieser Wert wird als 1 definiert, wenn die Compileroption/arch:AVX512
oder/arch:AVX10.1
festgelegt und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert.__AVX512F__
Dieser Wert wird als 1 definiert, wenn die Compileroption/arch:AVX512
oder/arch:AVX10.1
festgelegt und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert.__AVX512VL__
Dieser Wert wird als 1 definiert, wenn die Compileroption/arch:AVX512
oder/arch:AVX10.1
festgelegt und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert.__AVX10_VER__
Definiert als ganze Zahl, die Version von AVX10 darstellt, wenn die/arch:AVX10.1
Compileroption festgelegt wird und das Compilerziel x86 oder x64 ist. Andernfalls wird er nicht definiert._CHAR_UNSIGNED
Dieser Wert wird als 1 definiert, wenn derchar
-Standardtyp kein Vorzeichen hat. Dieser Wert wird definiert, wenn die Compileroption/J
(char-Standardtyp hat kein Vorzeichen) festgelegt ist. Andernfalls wird er nicht definiert.__CLR_VER
Dieser Wert wird als literale ganze Zahl definiert, die die Version der Common Language Runtime (CLR) darstellt, die zum Kompilieren der App verwendet wurde. Der Wert wird im FormatMmmbbbbb
codiert, wobeiM
die Hauptversion der Runtime,mm
die Nebenversion der Runtime undbbbbb
die Buildnummer ist.__CLR_VER
wird definiert, wenn die Compileroption/clr
festgelegt ist. Andernfalls wird er nicht definiert.// clr_ver.cpp // compile with: /clr using namespace System; int main() { Console::WriteLine(__CLR_VER); }
_CONTROL_FLOW_GUARD
Dieser Wert wird als 1 definiert, wenn die Compileroption/guard:cf
(Ablaufsteuerungsschutz aktivieren) festgelegt ist. Andernfalls wird er nicht definiert.__COUNTER__
Dieser Wert wird zu einem Literal erweitert, das für eine ganze Zahl ab 0 steht. Der Wert erhöht sich jedes Mal um 1, wenn er in einer Quelldatei verwendet wird, oder in eingeschlossenen Headern der Quelldatei.__COUNTER__
speichert den Zustand beim Verwenden vorkompilierter Header. Dieses Makro wird immer definiert.In diesem Beispiel wird
__COUNTER__
verwendet, um eindeutige Bezeichner drei verschiedenen Objekten desselben Typs zuzuweisen. DerexampleClass
-Konstruktor akzeptiert eine ganze Zahl als Parameter. Inmain
deklariert die Anwendung drei Objekte des TypsexampleClass
, wobei__COUNTER__
als eindeutiger Bezeichnerparameter verwendet wird:// 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
Dieser Wert wird als ganzzahliger Literalwert 200406 definiert, wenn er als C++ kompiliert und eine/clr
-Compileroption festgelegt ist. Andernfalls wird er nicht definiert. Wenn der Wert__cplusplus_cli
definiert wird, ist er in der gesamten Übersetzungseinheit aktiv.// 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
Dieser Wert wird als ganzzahliger Literalwert 201009 definiert, wenn er als C++ kompiliert und die Compileroption/ZW
(Windows-Runtime-Kompilierung) festgelegt ist. Andernfalls wird er nicht definiert._CPPRTTI
Dieser Wert wird als 1 definiert, wenn die Compileroption/GR
(Laufzeit-Typinformationen aktivieren) festgelegt ist. Andernfalls wird er nicht definiert._CPPUNWIND
Dieser Wert wird als 1 definiert, wenn mindestens eine der Compileroptionen/GX
(Ausnahmebehandlung aktivieren),/clr
(Common Language Runtime-Kompilierung) oder/EH
(Ausnahmebehandlungsmodell) festgelegt ist. Andernfalls wird er nicht definiert._DEBUG
Dieser Wert wird als 1 definiert, wenn eine der Compileroptionen/LDd
,/MDd
oder/MTd
festgelegt ist. Andernfalls wird er nicht definiert._DLL
Dieser Wert wird als 1 definiert, wenn die Compileroption/MD
oder/MDd
(Multithread-DLL) festgelegt ist. Andernfalls wird er nicht definiert.__FUNCDNAME__
Dieser Wert wird als Zeichenfolgenliteral definiert, das den dekorierten Namen der einschließenden Funktion enthält. Das Makro wird nur innerhalb einer Funktion definiert. Das Makro__FUNCDNAME__
wird nicht erweitert, wenn Sie die Compileroption/EP
oder/P
verwenden.In diesem Beispiel werden die Makros
__FUNCDNAME__
,__FUNCSIG__
und__FUNCTION__
verwendet, um Funktionsinformationen anzuzeigen.// 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__
Dieser Wert wird als Zeichenfolgenliteral definiert, das die Signatur einer einschließenden Funktion enthält. Das Makro wird nur innerhalb einer Funktion definiert. Das Makro__FUNCSIG__
wird nicht erweitert, wenn Sie die Compileroption/EP
oder/P
verwenden. Bei der Kompilierung für ein 64-Bit-Ziel lautet die Standardaufrufkonvention__cdecl
. Ein Beispiel für die Verwendung finden Sie im__FUNCDNAME__
-Makro.__FUNCTION__
Dieser Wert wird als Zeichenfolgenliteral definiert, das den undekorierten Namen der einschließenden Funktion enthält. Das Makro wird nur innerhalb einer Funktion definiert. Das Makro__FUNCTION__
wird nicht erweitert, wenn Sie die Compileroption/EP
oder/P
verwenden. Ein Beispiel für die Verwendung finden Sie im__FUNCDNAME__
-Makro._INTEGRAL_MAX_BITS
Dieser Wert wird als literale ganze Zahl 64 definiert, die maximale Größe (in Bit) eines integralen Typs, der kein Vektortyp ist. Dieses Makro wird immer definiert.// integral_max_bits.cpp #include <stdio.h> int main() { printf("%d\n", _INTEGRAL_MAX_BITS); }
__INTELLISENSE__
Dieser Wert wird während einer IntelliSense-Compilerübergabe in der integrierten Entwicklungsumgebung von Visual Studio als 1 definiert. Andernfalls wird er nicht definiert. Sie können dieses Makro verwenden, um den Code zu schützen, den der IntelliSense-Compiler nicht versteht. Außerdem können sie es dazu verwenden, zwischen dem Build- und dem IntelliSense-Compiler umzuschalten. Weitere Informationen finden Sie im Blogbeitrag zur Problembehandlung bei Langsamkeit von IntelliSense._ISO_VOLATILE
Dieser Wert wird als 1 definiert, wenn die Compileroption/volatile:iso
festgelegt ist. Andernfalls wird er nicht definiert._KERNEL_MODE
Dieser Wert wird als 1 definiert, wenn die Compileroption/kernel
(Binärdatei für den Kernelmodus erstellen) festgelegt ist. Andernfalls wird er nicht definiert._M_AMD64
Definiert als ganzzahliger Literalwert 100 für Kompilierungen, die auf x64-Prozessoren oder ARM64EC abzielen. Andernfalls wird er nicht definiert._M_ARM
Dieser Wert wird für Kompilierungen, die ARM-Prozessoren als Ziel verwenden, als literale ganze Zahl 7 definiert. Nicht definiert für ARM64, ARM64EC und andere Ziele._M_ARM_ARMV7VE
Dieser Wert wird als 1 definiert, wenn die Compileroption/arch:ARMv7VE
für Kompilierungen festgelegt ist, die ARM-Prozessoren als Ziel verwenden. Andernfalls wird er nicht definiert._M_ARM_FP
Dieser Wert wird als ganzzahliger Literalwert definiert, der angibt, welche/arch
-Compileroption für ARM-Prozessorziele festgelegt wurde. Andernfalls wird er nicht definiert.Ein Wert im Bereich 30–39, wenn keine
/arch
-ARM-Option festgelegt wurde, die angibt, dass die Standardarchitektur für ARM festgelegt wurde (VFPv3
).Ein Wert im Bereich 40–49, wenn
/arch:VFPv4
festgelegt wurde.Weitere Informationen finden Sie unter
/arch
(ARM).
_M_ARM64
Definiert als 1 für Kompilierungen, die auf ARM64 abzielen. Andernfalls wird er nicht definiert._M_ARM64EC
Definiert als 1 für Kompilierungen, die auf ARM64EC ausgerichtet sind. Andernfalls wird er nicht definiert._M_CEE
Dieser Wert wird als 001 definiert, wenn eine beliebige/clr
-Compileroption (Common Language Runtime-Kompilierung) festgelegt ist. Andernfalls wird er nicht definiert._M_CEE_PURE
Dieser Wert gilt ab Visual Studio 2015 als veraltet. Dieser Wert wird als 001 definiert, wenn die Compileroption/clr:pure
festgelegt ist. Andernfalls wird er nicht definiert._M_CEE_SAFE
Dieser Wert gilt ab Visual Studio 2015 als veraltet. Dieser Wert wird als 001 definiert, wenn die Compileroption/clr:safe
festgelegt ist. Andernfalls wird er nicht definiert._M_FP_CONTRACT
Verfügbar ab Visual Studio 2022 Definiert als 1, wenn die/fp:contract
/fp:fast
Compileroption festgelegt ist. Andernfalls wird er nicht definiert._M_FP_EXCEPT
Dieser Wert wird als 1 definiert, wenn die Compileroption/fp:except
oder/fp:strict
festgelegt ist. Andernfalls wird er nicht definiert._M_FP_FAST
Dieser Wert wird als 1 definiert, wenn die Compileroption/fp:fast
festgelegt ist. Andernfalls wird er nicht definiert._M_FP_PRECISE
Dieser Wert wird als 1 definiert, wenn die Compileroption/fp:precise
festgelegt ist. Andernfalls wird er nicht definiert._M_FP_STRICT
Dieser Wert wird als 1 definiert, wenn die Compileroption/fp:strict
festgelegt ist. Andernfalls wird er nicht definiert._M_IX86
Dieser Wert wird für Kompilierungen, die x86-Prozessoren als Ziel verwenden, als literale ganze Zahl 600 definiert. Dieses Makro ist nicht für x64- oder ARM-Kompilierungsziele definiert._M_IX86_FP
Dieser Wert wird als ganzzahliger Literalwert definiert, der die/arch
-Compileroption angibt, die festgelegt wurde, oder den Standardwert. Dieses Makro wird immer definiert, wenn es sich beim Kompilierungsziel um einen x86-Prozessor handelt. Andernfalls wird er nicht definiert. Wenn er definiert wird, lautet der Wert:0, wenn die Compileroption
/arch:IA32
festgelegt wurde.1, wenn die Compileroption
/arch:SSE
festgelegt wurde.2, wenn die
/arch:SSE2
Option ", "/arch:AVX
/arch:AVX2
oder/arch:AVX512
/arch:AVX10.1
"Compiler" festgelegt wurde. Dieser Wert ist der Standardwert, wenn keine/arch
-Compileroption angegeben wurde. Bei Angabe von/arch:AVX
wird auch das Makro__AVX__
definiert. Bei Angabe von/arch:AVX2
werden__AVX__
und__AVX2__
ebenfalls definiert. Bei Angabe von/arch:AVX512
werden__AVX__
,__AVX2__
,__AVX512BW__
,__AVX512CD__
,__AVX512DQ__
,__AVX512F__
und__AVX512VL__
ebenfalls definiert. Wenn/arch:AVX10.1
angegeben wird,__AVX__
werden , ,__AVX2__
,__AVX512DQ__
__AVX512BW__
__AVX512CD__
, ,__AVX512F__
,__AVX512VL__
und__AVX10_VER__
werden auch definiert.Weitere Informationen finden Sie unter
/arch
(x86).
_M_X64
Definiert als ganzzahliger Literalwert 100 für Kompilierungen, die auf x64-Prozessoren oder ARM64EC abzielen. Andernfalls wird er nicht definiert._MANAGED
Dieser Wert wird als 1 definiert, wenn die Compileroption/clr
festgelegt ist. Andernfalls wird er nicht definiert._MSC_BUILD
Dieser Wert wird als literale ganze Zahl definiert, die das Revisionsnummernelement der Versionsnummer des Compilers enthält. Die Revisionsnummer ist das letzte Element der durch Punkt getrennten Versionsnummer. Wenn beispielsweise die Versionsnummer des Microsoft C/C++-Compilers 15.00.20706.01 lautet, lautet das_MSC_BUILD
Makro 1. Dieses Makro wird immer definiert._MSC_EXTENSIONS
Dieser Wert wird als 1 definiert, wenn die standardmäßig aktivierte Compileroption/Ze
(Programmierspracherweiterungen aktivieren) festgelegt ist. Andernfalls wird er nicht definiert._MSC_FULL_VER
Dieser Wert wird als literale ganze Zahl definiert, die die Nummernelemente der Haupt- und Nebenversion sowie der Buildnummer der Versionsnummer des Compilers codiert. Die Nummer der Hauptversion ist das erste Element der durch Punkte getrennten Versionsnummer. Die Nummer der Nebenversion ist das zweite Element und die Buildnummer das dritte Element.Wenn die Microsoft C/C++-Compilerversion beispielsweise 19.39.33519 ist,
_MSC_FULL_VER
wird 193933519. Geben Siecl /?
in die Befehlszeile ein, um die Versionsnummer des Compilers anzuzeigen. Dieses Makro wird immer definiert. Weitere Informationen zur Compilerversionsverwaltung finden Sie unter C++-Compilerversionsverwaltung und insbesondere Dienstversionen ab Visual Studio 2017 , um weitere Informationen zu Visual Studio 2019 16.8, 16.9, 16.10 und 16.11 zu erhalten, die sie auseinander setzen müssen_MSC_FULL_VER
._MSC_VER
Dieser Wert wird als literale ganze Zahl definiert, die die Nummernelemente der Haupt- und der Nebenversion der Versionsnummer des Compilers codiert. Die Nummer der Hauptversion ist das erste Element der durch Punkte getrennten Versionsnummer und die Nummer der Nebenversion ist das zweite Element. Wenn die Versionsnummer des Microsoft C/C++-Compilers beispielsweise 17.00.51106.1 lautet, lautet der Wert_MSC_VER
1700. Geben Siecl /?
in die Befehlszeile ein, um die Versionsnummer des Compilers anzuzeigen. Dieses Makro wird immer definiert.Verwenden Sie den
>=
Operator, um auf Compilerversionen oder -updates in einer bestimmten Version von Visual Studio oder höher zu testen. Sie können ihn in einer bedingten Anweisung verwenden, um_MSC_VER
mit dieser bekannten Version zu vergleichen. Wenn Sie über mehrere sich gegenseitig ausschließende Versionen verfügen, ordnen Sie Ihre Vergleiche in absteigender Reihenfolge nach der Versionsnummer an. Mit diesem Code wird beispielsweise auf Compiler überprüft, die in Visual Studio 2017 oder höher veröffentlicht wurden. Als Nächstes überprüft er auf Compiler, die in Visual Studio 2015 oder höher veröffentlicht wurden. Anschließend überprüft er auf alle Compiler, die in Visual Studio-Versionen vor Visual Studio 2015 veröffentlicht wurden:#if _MSC_VER >= 1910 // . . . #elif _MSC_VER >= 1900 // . . . #else // . . . #endif
Weitere Informationen zu Visual Studio 2019 16.8 und 16.9 und 16.10 und 16.11, die die gleichen Haupt- und Nebenversionen aufweisen (und daher denselben Wert
_MSC_VER
haben), finden Sie unter Dienstversionen ab Visual Studio 2017.Weitere Informationen zum Verlauf der Compilerversionsverwaltung sowie compilerversionsnummern und der visual Studio-Versionen, die sie entsprechen, finden Sie unter C++-Compilerversionsverwaltung. Außerdem: Visual C++-Compilerversion im Microsoft C++-Teamblog.
_MSVC_LANG
Dieser Wert wird als literale ganze Zahl definiert, die den C++-Sprachstandard angibt, die der Compiler als Ziel verwendet. Nur Code, der als C++-Code kompiliert wurde, legt ihn fest. Das Makro ist standardmäßig oder, wenn die Compileroption/std:c++14
festgelegt wurde, der ganzzahlige Literalwert201402L
. Das Makro wird auf201703L
festgelegt, wenn die Compileroption/std:c++17
angegeben wird. Das Makro wird auf202002L
festgelegt, wenn die Compileroption/std:c++20
angegeben wird. Wenn die Option/std:c++latest
angegeben ist, wird der Wert auf einen höheren, unbestimmten Wert festgelegt. Andernfalls wird das Makro nicht definiert. Das Makro_MSVC_LANG
und die/std
-Compileroptionen (Standardversion für die Sprache festlegen) sind ab dem Update 3 von Visual Studio 2015 verfügbar.__MSVC_RUNTIME_CHECKS
Dieser Wert wird als 1 definiert, wenn eine der/RTC
-Compileroptionen festgelegt ist. Andernfalls wird er nicht definiert._MSVC_TRADITIONAL
:- Verfügbar ab Visual Studio 2017, Version 15.8: Definiert als 0, wenn die Compileroption für den Präprozessorkonformitätsmodus
/experimental:preprocessor
festgelegt ist. Dieser Wert wird standardmäßig oder bei festgelegter Compileroption/experimental:preprocessor-
als 1 definiert, um anzugeben, dass der herkömmliche Präprozessor verwendet wird. - Verfügbar ab Visual Studio 2019, Version 16.5: Definiert als 0, wenn die Compileroption für den Präprozessorkonformitätsmodus
/Zc:preprocessor
festgelegt ist. Dieser Wert wird standardmäßig oder bei festgelegter Compileroption/Zc:preprocessor-
als 1 definiert, um anzugeben, dass der herkömmliche Präprozessor verwendet wird (/Zc:preprocessor
ersetzt die veraltete Option/experimental:preprocessor
).
#if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL // Logic using the traditional preprocessor #else // Logic using cross-platform compatible preprocessor #endif
- Verfügbar ab Visual Studio 2017, Version 15.8: Definiert als 0, wenn die Compileroption für den Präprozessorkonformitätsmodus
_MT
Dieser Wert wird als 1 definiert, wenn/MD
oder/MDd
(Multithread-DLL) oder/MT
oder/MTd
(Multithread) angegeben wird. Andernfalls wird er nicht definiert._NATIVE_WCHAR_T_DEFINED
Dieser Wert wird als 1 definiert, wenn die Compileroption/Zc:wchar_t
festgelegt ist. Andernfalls wird er nicht definiert._OPENMP
Dieser Wert wird als ganzzahliger Literalwert 200203 definiert, wenn die Compileroption/openmp
(OpenMP 2.0-Unterstützung aktivieren) festgelegt ist. Dieser Wert stellt das Datum der von MSVC implementierten OpenMP-Spezifikation dar. Andernfalls wird er nicht definiert.// _OPENMP_dir.cpp // compile with: /openmp #include <stdio.h> int main() { printf("%d\n", _OPENMP); }
_PREFAST_
Dieser Wert wird als 1 definiert, wenn die Compileroption/analyze
festgelegt ist. Andernfalls wird er nicht definiert.__SANITIZE_ADDRESS__
Ab Visual Studio 2019 Version 16.9 verfügbar. Definiert als 1, wenn die/fsanitize=address
Compileroption festgelegt wird. Andernfalls wird er nicht definiert.__TIMESTAMP__
Dieser Wert wird als ein Zeichenfolgenliteral definiert, das das Datum und die Uhrzeit der letzten Änderung der aktuellen Quelldatei enthält. Es weist das von der CRT-Funktionasctime
zurückgegebene abgekürzte Format mit konstanter Länge auf und sieht z. B. so aus:Fri 19 Aug 13:32:58 2016
. Dieses Makro wird immer definiert._VC_NODEFAULTLIB
Dieser Wert wird als 1 definiert, wenn die Compileroption/Zl
(Kein Standardbibliotheksname) festgelegt ist. Andernfalls wird er nicht definiert._WCHAR_T_DEFINED
Dieser Wert wird als 1 definiert, wenn die Standardcompileroption/Zc:wchar_t
festgelegt ist. Das_WCHAR_T_DEFINED
-Makro wird definiert, weist jedoch keinen Wert auf, wenn die Compileroption/Zc:wchar_t-
festgelegt ist undwchar_t
in einer Systemheaderdatei in Ihrem Projekt definiert ist. Andernfalls wird er nicht definiert._WIN32
Dieser Wert wird als 1 definiert, wenn das Kompilierungsziel 32-Bit-ARM, 64-Bit-ARM, x86 oder x64 ist. Andernfalls wird er nicht definiert._WIN64
Dieser Wert wird als 1 definiert, wenn das Kompilierungsziel 64-Bit-ARM oder x64 ist. Andernfalls wird er nicht definiert._WINRT_DLL
Dieser Wert wird als 1 definiert, wenn er als C++ kompiliert wird und sowohl die Compileroption/ZW
(Windows-Runtime-Kompilierung) als auch/LD
oder/LDd
festgelegt ist. Andernfalls wird er nicht definiert.
Der Compiler definiert keine Präprozessormakros vor, die die ATL- oder MFC-Bibliotheksversion identifizieren. ATL- und MFC-Bibliotheksheader definieren diese Versionsmakros intern. Sie sind in Präprozessoranweisungen, die erstellt wurden, bevor der erforderliche Header eingeschlossen wurde, nicht definiert.
_ATL_VER
Dieser Wert wird in<atldef.h>
als ganzzahliger Literalwert definiert, der die ATL-Versionsnummer codiert._MFC_VER
Dieser Wert wird in<afxver_.h>
als ganzzahliger Literalwert definiert, die die MFC-Versionsnummer codiert.
Siehe auch
Makros (C/C++)
Präprozessoroperatoren
Präprozessoranweisungen