Udostępnij za pośrednictwem


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. 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.

Zakres

Kompilator języka C obsługuje następujące funkcje dotyczące zakresu.

  • Ponowne definiowanie extern elementów jako 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
    
  • 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 lub signed 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 atanfunkcji , , log10logsinsqrtcosexpatan2gdy 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 /Zenależ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