Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Microsoft 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++20 die /std:c++latest 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-valueHinweis
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.
`Scope`
Der C-Compiler unterstützt bezogen auf den Gültigkeitsbereich die folgenden Funktionen:
Neudefinitionen von
externElementen 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 linkageVerwendung 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 intVerwendung 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 initializersBitfelder mit anderen Basistypen als
unsigned intodersigned 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, , , atan2, cos, exp, loglog10, und sinsqrtFunktionen, wenn tan angegeben /Oiwird. 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