Freigeben über


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 von char 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 auf 201112L und für /std:c17 auf 201710L erweitert.

  • __STDCPP_DEFAULT_NEW_ALIGNMENT__Wenn /std:c17 oder später angegeben wird, wird dieses Makro auf ein size_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, z operator 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:AVXCompileroptionen /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:AVX2Compileroption /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 der char-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 Format Mmmbbbbb codiert, wobei M die Hauptversion der Runtime, mm die Nebenversion der Runtime und bbbbb 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. Der exampleClass-Konstruktor akzeptiert eine ganze Zahl als Parameter. In main deklariert die Anwendung drei Objekte des Typs exampleClass, 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:SSE2Option ", " /arch:AVX/arch:AVX2oder /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 Sie cl /? 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 Sie cl /? 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_VERhaben), 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 Literalwert 201402L. Das Makro wird auf 201703L festgelegt, wenn die Compileroption /std:c++17 angegeben wird. Das Makro wird auf 202002L 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
    
  • _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-Funktion asctime 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 und wchar_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