Bagikan melalui


Ekstensi Microsoft ke C dan C++

Microsoft Visual C++ (MSVC) memperluas standar bahasa C dan C++ dalam beberapa cara, yang dirinci dalam artikel ini.

Kompilator MSVC C++ default untuk mendukung ISO C++14 dengan beberapa fitur ISO C++17 dan beberapa ekstensi bahasa khusus Microsoft. Untuk informasi selengkapnya tentang fitur yang didukung, lihat Kesuaian bahasa Microsoft C/C++ menurut versi Visual Studio. Anda dapat menggunakan /std opsi pengkompilasi untuk mengaktifkan dukungan penuh untuk fitur bahasa ISO C++17 dan ISO C++20. Untuk informasi selengkapnya, lihat /std (Tentukan versi standar bahasa).

Jika ditentukan, beberapa ekstensi bahasa MSVC C++ dapat dinonaktifkan dengan menggunakan /Za opsi pengkompilasi. Di Visual Studio 2017 dan versi yang /permissive- lebih baru, opsi pengkompilasi menonaktifkan ekstensi bahasa C++ khusus Microsoft. Opsi /permissive- kompilator diaktifkan secara implisit oleh /std:c++20 opsi pengkompilasi dan /std:c++latest .

Secara default, ketika MSVC mengkompilasi kode sebagai C, MSVC mengimplementasikan ANSI C89 dengan ekstensi bahasa khusus Microsoft. Beberapa ekstensi MSVC ini distandarisasi dalam ISO C99 dan yang lebih baru. Sebagian besar ekstensi MSVC C dapat dinonaktifkan dengan menggunakan /Za opsi pengkompilasi, sebagaimana dirinci nanti dalam artikel ini. Anda dapat menggunakan /std opsi pengkompilasi untuk mengaktifkan dukungan untuk ISO C11 dan C17. Untuk informasi selengkapnya, lihat /std (Tentukan versi standar bahasa).

Pustaka runtime C standar diimplementasikan oleh pustaka runtime Universal C (UCRT) di Windows. UCRT juga mengimplementasikan banyak ekstensi POSIX dan pustaka khusus Microsoft. UCRT mendukung standar pustaka runtime ISO C11 dan C17 C, dengan peringatan khusus implementasi tertentu. Ini tidak mendukung pustaka runtime C standar ISO C99 lengkap. Untuk informasi selengkapnya, lihat kompatibilitas dalam dokumentasi pustaka runtime Universal C.

Kata Kunci

MSVC menambahkan beberapa kata kunci khusus Microsoft ke C dan C++. Dalam daftar di Kata Kunci, kata kunci yang memiliki dua garis bawah utama adalah ekstensi MSVC.

Mentransmisikan

Pengkompilasi C++ dan pengkompilasi C mendukung jenis cast non-standar ini:

  • Kompiler C mendukung cast non-standar untuk menghasilkan nilai l. Contoh:

    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
    

    Catatan

    Ekstensi ini hanya tersedia dalam bahasa C. Anda dapat menggunakan formulir standar C berikut dalam kode C++ untuk memodifikasi penunjuk seolah-olah itu adalah penunjuk ke jenis yang berbeda.

    Contoh sebelumnya dapat ditulis ulang sebagai berikut agar sesuai dengan standar C.

    p = ( char * )(( int * )p + 1 );
    
  • Pengkompilasi C dan C++ mendukung cast non-standar penunjuk fungsi ke penunjuk data. Contohnya:

    int ( * pfunc ) ();
    int *pdata;
    pdata = ( int * ) pfunc;
    /* No diagnostic at any level, whether compiled with default options or under /Za */
    

Daftar argumen panjang variabel

Kompilator C dan C++ mendukung deklarator fungsi yang menentukan jumlah variabel argumen, diikuti oleh definisi fungsi yang menyediakan jenis sebagai gantinya:

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.

Komentar satu baris

Pengompilasi C mendukung komentar baris tunggal, yang diperkenalkan dengan menggunakan dua karakter garis miring (//):

// This is a single-line comment.

Komentar baris tunggal adalah fitur C99. Mereka tidak terpengaruh oleh /Za dan tidak menyebabkan diagnostik pada tingkat apa pun.

Scope

Pengkompilasi C mendukung fitur terkait cakupan berikut.

  • Pendefinisian extern ulang item sebagai 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
    
  • Penggunaan redefinisi typedef jinak dalam cakupan yang sama:

    typedef int INT;
    typedef int INT; // No diagnostic at any level in C or C++
    
  • Deklarator fungsi memiliki cakupan file:

    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
    
  • Penggunaan variabel cakupan blok yang diinisialisasi dengan menggunakan ekspresi non-konstan:

    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;
    }
    

Deklarasi dan definisi data

Kompiler C mendukung fitur deklarasi dan definisi data berikut.

  • Konstanta karakter dan string campuran dalam penginisialisasi:

    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
    
  • Bidang bit yang memiliki jenis dasar selain unsigned int atau signed int.

  • Deklarator yang tidak memiliki jenis:

    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;
    }
    
  • Array tidak berukuran sebagai bidang terakhir dalam struktur dan serikat:

    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
    };
    
  • Struktur yang tidak disebutkan namanya (anonim):

    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'
    
  • Unnamed (anonim) unions:

    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'
    

Fungsi titik mengambang intrinsik

Kompilator x86 C++ dan pengkompilasi C mendukung pembuatan sebaris fungsi atan, , , cosatan2exp, log, log10sin, , sqrt, dan tan ketika /Oi ditentukan. Intrinsik ini tidak sesuai dengan standar, karena tidak mengatur errno variabel.

ISO646.H tidak diaktifkan

Di bawah /Ze, Anda harus menyertakan iso646.h jika Anda ingin menggunakan formulir teks operator berikut:

Operator Formulir teks
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq

Formulir teks ini tersedia sebagai kata kunci C++ di bawah /Za atau kapan /permissive- ditentukan atau tersirat.

Baca juga

/Za, /Ze (Nonaktifkan ekstensi bahasa)
Opsi pengkompilasi MSVC
Sintaks baris perintah pengkompilasi MSVC