Rozšíření Microsoft pro C a C++
Microsoft Visual C++ (MSVC) rozšiřuje jazykové standardy jazyka C a C++ několika způsoby, podrobně popsané v tomto článku.
Kompilátor MSVC C++ ve výchozím nastavení podporuje ISO C++14 s některými funkcemi ISO C++17 a některými jazykovými rozšířeními specifických pro Microsoft. Další informace o podporovaných funkcích najdete v tématu Shoda jazyka Microsoft C/C++ podle verze sady Visual Studio. Pomocí možnosti kompilátoru /std
můžete povolit plnou podporu funkcí jazyka ISO C++17 a ISO C++20. Další informace najdete v tématu /std
(Určení standardní verze jazyka).
Pokud je uvedeno, některé jazykové rozšíření jazyka MSVC C++ mohou být zakázány pomocí možnosti kompilátoru /Za
. V sadě Visual Studio 2017 a novějších verzích zakáže možnost kompilátoru /permissive-
jazyková rozšíření jazyka C++ specifická pro Microsoft. Možnost kompilátoru /permissive-
je implicitně povolena možnostmi a /std:c++latest
možnostmi kompilátoru/std:c++20
.
Když MSVC ve výchozím nastavení zkompiluje kód jako C, implementuje ANSI C89 s jazykovými rozšířeními specifických pro Microsoft. Některá z těchto rozšíření MSVC jsou standardizována v ISO C99 a novějších verzích. Většina rozšíření JAZYKa C MSVC může být zakázána pomocí možnosti kompilátoru /Za
, jak je popsáno dále v tomto článku. Pomocí možnosti kompilátoru /std
můžete povolit podporu iso C11 a C17. Další informace najdete v tématu /std
(Určení standardní verze jazyka).
Standardní knihovnu modulu runtime jazyka C implementuje knihovna modulu runtime Universal C (UCRT) ve Windows. UCRT také implementuje mnoho rozšíření knihoven POSIX a specifických pro Microsoft. UCRT podporuje standardy knihoven runtime ISO C11 a C17 C s určitými upozorněními specifických pro implementaci. Nepodporuje úplnou standardní knihovnu modulu runtime C99 ISO C99. Další informace najdete v dokumentaci ke knihovně modulu runtime Universal C.
Klíčová slova
MSVC přidá do jazyka C a C++ několik klíčových slov specifických pro Microsoft. V seznamu klíčových slov jsou klíčová slova, která mají dvě úvodní podtržítka, rozšíření MSVC.
Předvádí
Kompilátor C++ i kompilátor jazyka C podporují tyto druhy nestandardních přetypování:
Kompilátor jazyka C podporuje nestandardní přetypování pro vytváření l-hodnot. Příklad:
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
Poznámka:
Toto rozšíření je k dispozici pouze v jazyce C. Následující standardní formulář jazyka C v kódu C++ můžete použít k úpravě ukazatele, jako by se jedná o ukazatel na jiný typ.
Předchozí příklad lze přepsat následujícím způsobem, aby odpovídal standardu C.
p = ( char * )(( int * )p + 1 );
Kompilátory jazyka C a C++ podporují nestandardní přetypování ukazatele funkce na datový ukazatel. Příklad:
int ( * pfunc ) (); int *pdata; pdata = ( int * ) pfunc; /* No diagnostic at any level, whether compiled with default options or under /Za */
Seznamy argumentů s proměnnou délkou
Kompilátory jazyka C i C++ podporují deklarátor funkce, který určuje proměnný počet argumentů následovaný definicí funkce, která místo toho poskytuje 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.
Jednořádkové komentáře
Kompilátor jazyka C podporuje jednořádkové komentáře, které jsou zavedeny pomocí dvou znaků lomítka (//
):
// This is a single-line comment.
Jednořádkové komentáře jsou funkce C99. Nejsou ovlivněné /Za
a nemají žádnou diagnostiku na žádné úrovni.
Obor
Kompilátor jazyka C podporuje následující funkce vztahující se k rozsahu.
Redefinitions of
extern
items asstatic
: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
Použití neškodné redefinice typedef v rámci stejného rozsahu:
typedef int INT; typedef int INT; // No diagnostic at any level in C or C++
Deklarátory funkce mají rozsah souboru:
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
Použití proměnných oboru bloku, které jsou inicializovány pomocí ne constant výrazů:
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; }
Deklarace dat a definice
Kompilátor jazyka C podporuje následující funkce deklarace a definice dat.
Smíšené znakové a řetězcové konstanty v inicializátoru:
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
Bitová pole, která mají jiné základní typy než
unsigned int
nebosigned int
.Deklarátory, které nemají 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; }
Pole bez velikosti jako poslední pole ve strukturách a sjednoceních:
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 };
Nepojmenované struktury (anonymní):
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'
Nepojmenovaná sjednocení (anonymní):
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'
Vnitřní funkce s plovoucí desetinou čárkou
Kompilátor jazyka C++ x86 i kompilátor jazyka C podporují vložené generování , , , , , log
, , log10
, a sqrt
tan
sin
funkce, pokud /Oi
je zadáno. exp
cos
atan2
atan
Tyto vnitřní objekty neodpovídají standardu, protože nenastavují proměnnou errno
.
ISO646.H
nepovoleno
V části /Ze
, musíte zahrnout iso646.h
, pokud chcete použít textové formuláře následujících operátorů:
Operátor | Textový formulář |
---|---|
&& |
and |
&= |
and_eq |
& |
bitand |
| |
bitor |
~ |
compl |
! |
not |
!= |
not_eq |
|| |
or |
|= |
or_eq |
^ |
xor |
^= |
xor_eq |
Tyto textové formuláře jsou k dispozici jako klíčová slova jazyka C++ v zadaném /Za
/permissive-
nebo předpokládaném znění.
Viz také
/Za
, /Ze
(zakázání jazykových rozšíření)
Možnosti kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC