Teilen über


Microsoft-Erweiterungen für C und C++

Microsoft Visual C++ (MSVC) erweitert die C- und C++-Sprachstandards auf verschiedene Arten, die in diesem Artikel beschrieben werden.

Der MSVC C++-Compiler unterstützt standardmäßig ISO C++14 mit einigen ISO C++17-Features und einigen microsoftspezifischen Spracherweiterungen. Weitere Informationen zu unterstützten Features finden Sie in der Version von Visual Studio unter Microsoft C/C++-Sprachkonformität. Sie können die /std Compileroption verwenden, um die vollständige Unterstützung für ISO C++17- und ISO C++20-Sprachfeatures zu aktivieren. Weitere Informationen finden Sie unter /std (Angeben der Sprachstandardversion).

Wo angegeben, können einige MSVC C++-Spracherweiterungen mithilfe der /Za Compileroption deaktiviert werden. In Visual Studio 2017 und höheren Versionen deaktiviert die /permissive- Compileroption microsoftspezifische C++-Spracherweiterungen. Die /permissive- Compileroption wird implizit durch die Compileroptionen und /std:c++latest die /std:c++20 Compileroptionen aktiviert.

Wenn MSVC Code als C kompiliert, implementiert MSVC standardmäßig ANSI C89 mit microsoftspezifischen Spracherweiterungen. Einige dieser MSVC-Erweiterungen werden in ISO C99 und höher standardisiert. Die meisten MSVC C-Erweiterungen können mithilfe der /Za Compileroption deaktiviert werden, wie weiter unten in diesem Artikel beschrieben. Sie können die /std Compileroption verwenden, um die Unterstützung für ISO C11 und C17 zu aktivieren. Weitere Informationen finden Sie unter /std (Angeben der Sprachstandardversion).

Die C-Laufzeitbibliothek wird von der Universellen C-Laufzeitbibliothek (UCRT) in Windows implementiert. Das UCRT implementiert auch viele POSIX- und Microsoft-spezifische Bibliothekserweiterungen. Die UCRT unterstützt die ISO C11- und C17 C-Laufzeitbibliotheksstandards mit bestimmten implementierungsspezifischen Einschränkungen. Die vollständige C99-Standard-C-Laufzeitbibliothek wird nicht unterstützt. Weitere Informationen finden Sie in der Dokumentation zur universellen C-Laufzeitbibliothek.

Schlüsselwörter

MSVC fügt mehrere microsoftspezifische Schlüsselwort (keyword) zu C und C++ hinzu. In der Liste in Schlüsselwörtern sind die Schlüsselwort (keyword) mit zwei führenden Unterstrichen MSVC-Erweiterungen.

Umwandlungen

Sowohl der C++-Compiler als auch der C-Compiler unterstützen diese Arten von nicht standardmäßigen Casts:

  • Der C-Compiler unterstützt nicht standardmäßige Umwandlungen, um l-Werte zu erzeugen. Beispiel:

    char *p;
    (( int * ) p )++;
    // In C with /W4, both by default and under /Ze:
    //     warning C4213: nonstandard extension used: cast on l-value
    // Under /TP or /Za:
    //     error C2105: '++' needs l-value
    

    Hinweis

    Diese Erweiterung ist nur in der Programmiersprache C verfügbar. Sie können das folgende C-Standardformular im C++-Code verwenden, um einen Zeiger so zu ändern, als wäre es ein Zeiger auf einen anderen Typ.

    Das vorangehende Beispiel könnte wie folgt umgeschrieben werden, um dem C-Standard zu entsprechen.

    p = ( char * )(( int * )p + 1 );
    
  • Sowohl die C- als auch die C++-Compiler unterstützen nicht standardmäßige Umwandlungen eines Funktionszeigers auf einen Datenzeiger. Beispiel:

    int ( * pfunc ) ();
    int *pdata;
    pdata = ( int * ) pfunc;
    /* No diagnostic at any level, whether compiled with default options or under /Za */
    

Argumentlisten mit variabler Länge

Sowohl C- als auch C++-Compiler unterstützen einen Funktionsdeklarationsator, der eine variable Anzahl von Argumenten angibt, gefolgt von einer Funktionsdefinition, die stattdessen einen Typ bereitstellt:

void myfunc( int x, ... );
void myfunc( int x, char * c )
{ }
// In C with /W4, either by default or under /Ze:
//     warning C4212: nonstandard extension used: function declaration used ellipsis
// In C with /W4, under /Za:
//     warning C4028: formal parameter 2 different from declaration
// In C++, no diagnostic by default or under /Za.

Einzeilige Kommentare

Der C-Compiler unterstützt single-Zeilenkommentar s, die mit zwei Schrägstrichzeichen (//) eingeführt werden:

// This is a single-line comment.

Single-Zeilenkommentar s sind ein C99-Feature. Sie sind nicht betroffen und /Za verursachen keine Diagnose auf irgendeiner Ebene.

`Scope`

Der C-Compiler unterstützt bezogen auf den Gültigkeitsbereich die folgenden Funktionen:

  • Neudefinitionen von extern Elementen als static:

    extern int clip();
    static int clip() {}
    // In C and C++ with /W4, either by default or under /Ze:
    //     warning C4211: nonstandard extension used: redefined extern to static
    // In C and C++ under /Za:
    //     error C2375: 'clip': redefinition; different linkage
    
  • Verwendung von typedef-Neudefinitionen ohne Auswirkung innerhalb desselben Gültigkeitsbereichs:

    typedef int INT;
    typedef int INT; // No diagnostic at any level in C or C++
    
  • Funktionsdeklaratoren haben einen Dateigültigkeitsbereich:

    void func1()
    {
         extern double func2( double );
         // In C at /W4:  warning C4210: nonstandard extension used: function given file scope
    }
    int main( void )
    {
         func2( 4 );    //  /Ze passes 4 as type double
    }                  //  /Za passes 4 as type int
    
  • Verwendung von Blockbereichsvariablen, die mithilfe von nicht konstanten Ausdrücken initialisiert werden:

    int clip( int );
    int bar( int );
    int main( void )
    {
         int array[2] = { clip( 2 ), bar( 4 ) };
    }
    int clip( int x )
    {
         return x;
    }
    int bar( int x )
    {
         return x;
    }
    

Datendeklarationen und Definitionen

Der C-Compiler unterstützt die folgenden Datendeklarations- und Datendefinitionsfunktionen:

  • Gemischte Zeichen- und Zeichenfolgenkonstanten in einer Initialisierung:

    char arr[6] = {'a', 'b', "cde"};
    // In C with /W4, either by default or under /Ze:
    //     warning C4207: nonstandard extension used: extended initializer form
    // Under /Za:
    //     error C2078: too many initializers
    
  • Bitfelder mit anderen Basistypen als unsigned int oder signed int.

  • Deklaratoren, die keinen Typ haben:

    x;
    // By default or under /Ze, /Za, /std:c11, and /std:c17, when /W4 is specified:
    //     warning C4431: missing type specifier - int assumed. Note: C no longer supports default-int
    //     warning C4218: nonstandard extension used: must specify at least a storage class or a type
    */
    int main( void )
    {
         x = 1;
    }
    
  • Arrays ohne Größenangabe als letztes Feld in Strukturen und Unions:

    struct zero
    {
         char *c;
         int zarray[];
         // In C with /W4, either by default, under /Ze, /std:c11, and /std:c17:
         //     warning C4200: nonstandard extension used: zero-sized array in struct/union
         // Under /Za:
         //     error C2133: 'zarray': unknown size
    };
    
  • Unbenannte (anonyme) Strukturen:

    struct
    {
         int i;
         char *s;
    };
    // By default or under /Ze, /std:c11, and /std:c17, when /W4 is specified:
    //     warning C4094: untagged 'struct' declared no symbols
    // Under /Za:
    //     error C2059: syntax error: 'empty declaration'
    
  • Unbenannte (anonyme) Unions:

    union
    {
         int i;
         float fl;
    };
    // By default or under /Ze, /std:c11, and /std:c17, when /W4 is specified:
    //     warning C4094: untagged 'union' declared no symbols
    // Under /Za:
    //     error C2059: syntax error: 'empty declaration'
    

Systeminterne Gleitkommafunktionen

Sowohl der x86-C++-Compiler als auch der C-Compiler unterstützen die Inlinegenerierung von atan, , , cos, exp, log, log10sin, und tansqrtFunktionen, wenn /Oi angegeben atan2wird. Diese systeminternen Elemente entsprechen nicht dem Standard, da sie die errno Variable nicht festlegen.

ISO646.H nicht aktiviert

Unter /Ze, müssen Sie einschließen iso646.h , wenn Sie Textformen der folgenden Operatoren verwenden möchten:

Operator Textformular
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq

Diese Textformulare sind als C++-Schlüsselwort (keyword) unter /Za oder wenn /permissive- angegeben oder impliziert.

Siehe auch

/Za, /Ze (Spracherweiterungen deaktivieren)
MSVC-Compileroptionen
MSVC-Compiler-Befehlszeilensyntax