Sdílet prostřednictvím


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.

Vrhá

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 as static:

    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 nebo signed 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 sqrttansinfunkce, pokud /Oi je zadáno. expcosatan2atan 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