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üsselwörter zu C und C++ hinzu. In der Liste in Schlüsselwörtern sind die Schlüsselwörter 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. Zum 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. Zum 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.
Bereich
Der C-Compiler unterstützt bezogen auf den Gültigkeitsbereich die folgenden Funktionen:
Neudefinitionen von
extern
Elementen alsstatic
: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
odersigned 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
, log10
sin
, und tan
sqrt
Funktionen, wenn /Oi
angegeben atan2
wird. 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üsselwörter unter /Za
oder wenn /permissive-
angegeben oder impliziert.
Siehe auch
/Za
, /Ze
(Spracherweiterungen deaktivieren)
MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile