Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Microsoft C++ (MSVC) utökar språkstandarderna C och C++ på flera sätt, som beskrivs i den här artikeln.
MSVC C++-kompilatorn stöder som standard ISO C++14 med vissa ISO C++17-funktioner och vissa Microsoft-specifika språktillägg. Mer information om funktioner som stöds finns i Microsoft C/C++-språkefterlevnad efter Visual Studio-version. Du kan använda kompileringsalternativet /std för att aktivera fullständigt stöd för språkfunktionerna ISO C++17 och ISO C++20. Mer information finns i /std (Ange språkstandardversion).
Om det anges kan vissa MSVC C++-språktillägg inaktiveras med hjälp av kompilatoralternativet /Za . I Visual Studio 2017 och senare versioner inaktiverar kompileringsalternativet /permissive- Microsoft-specifika C++-språktillägg. Kompilatoralternativet /permissive- aktiveras implicit av kompilatoralternativen /std:c++20 och /std:c++latest .
När MSVC som standard kompilerar kod som C implementerar den ANSI C89 med Microsoft-specifika språktillägg. Vissa av dessa MSVC-tillägg är standardiserade i ISO C99 och senare. De flesta MSVC C-tillägg kan inaktiveras med hjälp av kompilatoralternativet /Za , som beskrivs senare i den här artikeln. Du kan använda kompilatoralternativet /std för att aktivera stöd för ISO C11 och C17. Mer information finns i /std (Ange språkstandardversion).
Standard-C-körningsbiblioteket implementeras av UCRT (Universal C Runtime Library) i Windows. UCRT implementerar också många POSIX- och Microsoft-specifika bibliotekstillägg. UCRT stöder iso C11- och C17 C-körningsbiblioteksstandarderna, med vissa implementeringsspecifika varningar. Det stöder inte det fullständiga ISO C99-standard-C-körningsbiblioteket. Mer information finns i kompatibilitet i dokumentationen för Universal C-körningsbiblioteket.
Nyckelord
MSVC lägger till flera Microsoft-specifika nyckelord till C och C++. I listan i Nyckelord är nyckelorden som har två inledande understreck MSVC-tillägg.
Kastar
Både C++-kompilatorn och C-kompilatorn stöder dessa typer av icke-standard casts:
C-kompilatorn stöder icke-standardgjutningar för att producera l-värden. Till exempel:
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-valueAnmärkning
Det här tillägget är endast tillgängligt på C-språket. Du kan använda följande C-standardformulär i C++-kod för att ändra en pekare som om det vore en pekare till en annan typ.
Föregående exempel kan skrivas om enligt följande för att överensstämma med C-standarden.
p = ( char * )(( int * )p + 1 );Både C- och C++-kompilatorerna stöder icke-standardgjutningar av en funktionspekare till en datapekare. Till exempel:
int ( * pfunc ) (); int *pdata; pdata = ( int * ) pfunc; /* No diagnostic at any level, whether compiled with default options or under /Za */
Argumentlistor med variabel längd
Både C- och C++-kompilatorer stöder en funktionsdeklarator som anger ett variabelt antal argument, följt av en funktionsdefinition som tillhandahåller en typ i stället:
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.
Kommentarer med en rad
C-kompilatorn stöder enradskommentarer som introduceras med hjälp av två snedstreck (//) tecken:
// This is a single-line comment.
Enradskommentarer är en C99-funktion. De påverkas inte av /Za och orsakar ingen diagnostik på någon nivå.
Omfång
C-kompilatorn stöder följande omfångsrelaterade funktioner.
Omdefinitioner av
externobjekt somstatic: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 linkageAnvändning av godartade typedef-omdefinitioner inom samma omfång:
typedef int INT; typedef int INT; // No diagnostic at any level in C or C++Funktionsdeklaratorer har filomfång:
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 intAnvändning av variabler för blockomfattning som initieras med hjälp av icke-konstanta uttryck:
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; }
Datadeklarationer och definitioner
C-kompilatorn stöder följande datadeklarations- och definitionsfunktioner.
Blandade tecken- och strängkonstanter i en initiator:
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 initializersBitfält som har andra bastyper än
unsigned intellersigned int.Deklaratorer som inte har någon typ:
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; }Ej anpassade matriser som det sista fältet i strukturer och fackföreningar:
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 };Namnlösa (anonyma) strukturer:
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'Icke namngivna (anonyma) fackföreningar:
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'
Inbyggda flyttalsfunktioner
Både x86 C++-kompilatorn och C-kompilatorn stöder infogad generering av atanfunktionerna , atan2, cos, exp, log10log, sin, sqrtoch tan när /Oi anges. Dessa inbyggda egenskaper överensstämmer inte med standarden eftersom de inte anger variabeln errno .
ISO646.H inte aktiverat
Under /Zemåste du inkludera iso646.h om du vill använda textformulär för följande operatorer:
| Operator | Textformulär |
|---|---|
&& |
and |
&= |
and_eq |
& |
bitand |
| |
bitor |
~ |
compl |
! |
not |
!= |
not_eq |
|| |
or |
|= |
or_eq |
^ |
xor |
^= |
xor_eq |
Dessa textformulär är tillgängliga som C++-nyckelord under /Za eller när /permissive- är angivet eller underförstått.
Se även
/Za, /Ze (Inaktivera språktillägg)
MSVC-kompilatoralternativ
kommandoradssyntax för MSVC-kompilatorn