Rozszerzenia Microsoft do C i C++
Program Microsoft Visual C++ (MSVC) rozszerza standardy języka C i C++ na kilka sposobów, szczegółowo opisanych w tym artykule.
Kompilator MSVC C++ domyślnie obsługuje język ISO C++14 z niektórymi funkcjami ISO C++17 i rozszerzeniami języka specyficznymi dla firmy Microsoft. Aby uzyskać więcej informacji na temat obsługiwanych funkcji, zobacz zgodność języka Microsoft C/C++ z wersją programu Visual Studio. Możesz użyć opcji kompilatora /std
, aby włączyć pełną obsługę funkcji języka ISO C++17 i ISO C++20. Aby uzyskać więcej informacji, zobacz /std
(Określ wersję standardową języka).
W przypadku określenia niektórych rozszerzeń języka C++ MSVC można wyłączyć za pomocą opcji kompilatora /Za
. W programie Visual Studio 2017 i nowszych wersjach /permissive-
opcja kompilatora wyłącza rozszerzenia języka C++ specyficzne dla firmy Microsoft. Opcja kompilatora /permissive-
jest niejawnie włączona przez opcje kompilatora /std:c++20
i /std:c++latest
.
Domyślnie, gdy MSVC kompiluje kod jako C, implementuje anSI C89 z rozszerzeniami języka specyficznymi dla firmy Microsoft. Niektóre z tych rozszerzeń MSVC są ustandaryzowane w standardzie ISO C99 i nowszych. Większość rozszerzeń języka C MSVC można wyłączyć przy użyciu opcji kompilatora /Za
, zgodnie z opisem w dalszej części tego artykułu. Możesz użyć opcji kompilatora /std
, aby włączyć obsługę iso C11 i C17. Aby uzyskać więcej informacji, zobacz /std
(Określ wersję standardową języka).
Standardowa biblioteka środowiska uruchomieniowego języka C jest implementowana przez uniwersalną bibliotekę środowiska uruchomieniowego języka C (UCRT) w systemie Windows. UCRT implementuje również wiele rozszerzeń bibliotek specyficznych dla platformy POSIX i firmy Microsoft. UCRT obsługuje standardy bibliotek środowiska uruchomieniowego ISO C11 i C17 C z pewnymi zastrzeżeniami specyficznymi dla implementacji. Nie obsługuje pełnej standardowej biblioteki środowiska uruchomieniowego języka C ISO C99. Aby uzyskać więcej informacji, zobacz zgodność w dokumentacji biblioteki środowiska uruchomieniowego uniwersalnego języka C.
Słowa kluczowe
MSVC dodaje kilka słów kluczowych specyficznych dla firmy Microsoft do języków C i C++. Na liście w słowach kluczowych słowa kluczowe, które mają dwa wiodące podkreślenia, to rozszerzenia MSVC.
Rzuca
Kompilator języka C++ i kompilator języka C obsługują te rodzaje nietypowych rzutów:
Kompilator języka C obsługuje nietypowe rzutowania w celu utworzenia wartości l.. Na przykład:
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
Uwaga
To rozszerzenie jest dostępne tylko w języku C. Możesz użyć następującego standardowego formularza języka C w kodzie C++, aby zmodyfikować wskaźnik tak, jakby był wskaźnikiem do innego typu.
Powyższy przykład może zostać przepisany w następujący sposób, aby był zgodny ze standardem C.
p = ( char * )(( int * )p + 1 );
Kompilatory języka C i C++ obsługują nietypowe rzutowania wskaźnika funkcji na wskaźnik danych. Na przykład:
int ( * pfunc ) (); int *pdata; pdata = ( int * ) pfunc; /* No diagnostic at any level, whether compiled with default options or under /Za */
Listy argumentów o zmiennej długości
Kompilatory języka C i C++ obsługują deklarator funkcji, który określa zmienną liczbę argumentów, a następnie definicję funkcji, która udostępnia typ:
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.
Komentarze jednowierszowe
Kompilator języka C obsługuje komentarze jednowierszowe, które są wprowadzane przy użyciu dwóch znaków ukośnika (//
):
// This is a single-line comment.
Komentarze jednowierszowe to funkcja C99. Nie mają one wpływu /Za
na nie i powodują brak diagnostyki na żadnym poziomie.
Scope
Kompilator języka C obsługuje następujące funkcje dotyczące zakresu.
Ponowne definiowanie
extern
elementów jakostatic
: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
Używanie nieszkodliwych zmian definicji typów w tym samym zakresie:
typedef int INT; typedef int INT; // No diagnostic at any level in C or C++
Deklaratory funkcji z ustawionym zakresem pliku:
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
Użyj zmiennych zakresu blokowego, które są inicjowane przy użyciu wyrażeń niestałych:
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; }
Deklaracje i definicje danych
Kompilator języka C obsługuje następujące funkcje deklarowania i definiowania danych.
Mieszane znaki i stałe w postaci ciągów w inicjatorze:
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
Pola bitowe, które mają typy podstawowe inne niż
unsigned int
lubsigned int
.Deklaratory, które nie mają typu:
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; }
Tablice bez określonego rozmiaru występujące jako ostatnie pole w strukturach i złożeniach:
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 };
Struktury nienazwane (anonimowe):
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'
Złożenia nienazwane (anonimowe):
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'
Wewnętrzne funkcje zmiennoprzecinkowe
Zarówno kompilator x86 C++, jak i kompilator języka C obsługują wbudowane generowanie atan
funkcji , , log10
log
sin
sqrt
cos
exp
atan2
gdy tan
/Oi
jest określona. Te funkcje wewnętrzne nie są zgodne ze standardem, ponieważ nie ustawiają zmiennej errno
.
ISO646.H
nie włączono
W obszarze /Ze
należy uwzględnić iso646.h
, jeśli chcesz użyć formularzy tekstowych następujących operatorów:
Operator | Formularz tekstowy |
---|---|
&& |
and |
&= |
and_eq |
& |
bitand |
| |
bitor |
~ |
compl |
! |
not |
!= |
not_eq |
|| |
or |
|= |
or_eq |
^ |
xor |
^= |
xor_eq |
Te formularze tekstowe są dostępne jako słowa kluczowe języka C++ w obszarze /Za
lub, gdy /permissive-
jest określony lub implikowane.
Zobacz też
/Za
, /Ze
(Wyłącz rozszerzenia językowe)
Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC