C ve C++ için Microsoft uzantıları

Microsoft Visual C++ (MSVC), C ve C++ dil standartlarını bu makalede ayrıntılı olarak belirtilen çeşitli şekillerde genişletir.

MSVC C++ derleyicisi, bazı ISO C++17 özellikleri ve Bazı Microsoft'a özgü dil uzantılarıyla ISO C++14 için varsayılan olarak destek sunar. Desteklenen özellikler hakkında daha fazla bilgi için bkz . Visual Studio sürümüne göre Microsoft C/C++ dil uyumluluğu. ISO C++17 ve ISO C++20 dil özellikleri için tam desteği etkinleştirmek için derleyici seçeneğini kullanabilirsiniz /std . Daha fazla bilgi için bkz /std . (Dil standart sürümünü belirtme).

Belirtildiğinde, bazı MSVC C++ dil uzantıları derleyici seçeneğiyle /Za devre dışı bırakılabilir. Visual Studio 2017 ve sonraki sürümlerde, /permissive- derleyici seçeneği Microsoft'a özgü C++ dil uzantılarını devre dışı bırakır. Derleyici /permissive- seçeneği ve /std:c++latest derleyici seçenekleri tarafından /std:c++20 örtük olarak etkinleştirilir.

Varsayılan olarak, MSVC kodu C olarak derlediğinde, Microsoft'a özgü dil uzantılarıyla ANSI C89 uygular. Bu MSVC uzantılarından bazıları ISO C99 ve sonraki sürümlerde standartlaştırılmıştır. MsVC C uzantılarının çoğu, bu makalenin /Za ilerleyen bölümlerinde açıklandığı gibi derleyici seçeneğiyle devre dışı bırakılabilir. ISO C11 ve C17 desteğini etkinleştirmek için derleyici seçeneğini kullanabilirsiniz /std . Daha fazla bilgi için bkz /std . (Dil standart sürümünü belirtme).

Standart C çalışma zamanı kitaplığı, Windows'daki Evrensel C çalışma zamanı kitaplığı (UCRT) tarafından uygulanır. UCRT ayrıca birçok POSIX ve Microsoft'a özgü kitaplık uzantısı uygular. UCRT, uygulamaya özgü bazı uyarılar ile ISO C11 ve C17 C çalışma zamanı kitaplık standartlarını destekler. Tam ISO C99 standart C çalışma zamanı kitaplığını desteklemez. Daha fazla bilgi için Evrensel C çalışma zamanı kitaplığı belgelerindeki uyumluluk bölümüne bakın.

Anahtar sözcükler

MSVC, C ve C++'a Microsoft'a özgü birkaç anahtar sözcük ekler. Anahtar Sözcükler listesinde, önde gelen iki alt çizgi içeren anahtar sözcükler MSVC uzantılarıdır.

Çevirir

Hem C++ derleyicisi hem de C derleyicisi şu tür standart dışı atamaları destekler:

  • C derleyicisi, l değerleri üretmek için standart olmayan atamaları destekler. Örneğin:

    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
    

    Not

    Bu uzantı yalnızca C dilinde kullanılabilir. Bir işaretçiyi farklı bir türe işaret ediyor gibi değiştirmek için C++ kodunda aşağıdaki C standart formunu kullanabilirsiniz.

    Yukarıdaki örnek, C standardına uyması için aşağıdaki gibi yeniden yazılabilir.

    p = ( char * )(( int * )p + 1 );
    
  • Hem C hem de C++ derleyicileri, işlev işaretçisinin standart olmayan veri işaretçisi atamalarını destekler. Örneğin:

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

Değişken uzunluklu bağımsız değişken listeleri

Hem C hem de C++ derleyicileri değişken sayıda bağımsız değişken belirten bir işlev bildirimcisini ve ardından bir tür sağlayan işlev tanımını destekler:

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.

Tek satırlı açıklamalar

C derleyicisi, iki eğik çizgi (//) karakteri kullanılarak sunulan tek satırlı açıklamaları destekler:

// This is a single-line comment.

Tek satırlı açıklamalar bir C99 özelliğidir. Bu kişiler etkilenmez /Za ve herhangi bir düzeyde tanılamaya neden olmaz.

Kapsam

C derleyicisi kapsamla ilgili aşağıdaki özellikleri destekler.

  • Öğelerin olarak staticyeniden tanımlarıextern:

    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
    
  • Aynı kapsamda zararsız typedef yeniden tanımlarının kullanımı:

    typedef int INT;
    typedef int INT; // No diagnostic at any level in C or C++
    
  • İşlev bildirimcileri dosya kapsamına sahiptir:

    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
    
  • Sabit olmayan ifadeler kullanılarak başlatılan blok kapsamı değişkenlerinin kullanımı:

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

Veri bildirimleri ve tanımları

C derleyicisi aşağıdaki veri bildirimi ve tanım özelliklerini destekler.

  • Başlatıcıda karışık karakter ve dize sabitleri:

    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
    
  • veya signed intdışında unsigned int temel türleri olan bit alanları.

  • Türü olmayan bildirimciler:

    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;
    }
    
  • Yapılarda ve birleşimlerde son alan olarak unsized diziler:

    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
    };
    
  • Adsız (anonim) yapılar:

    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'
    
  • Adsız (anonim) birleşimler:

    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'
    

İç kayan nokta işlevleri

Hem x86 C++ derleyicisi hem de C derleyicisi, belirtildiğinde /Oi , atan2, expcos, , log, log10, , sinsqrt, ve tan işlevlerinin atansatır içi oluşturulmasını destekler. Bu içsel değerler, değişkeni ayarlamadığından standarda errno uymaz.

ISO646.H etkin değil

altında /Ze, aşağıdaki işleçlerin metin formlarını kullanmak istiyorsanız eklemeniz iso646.h gerekir:

Operatör Metin formu
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq

Bu metin formları, altında /Za veya belirtildiğinde veya örtülü olduğunda /permissive- C++ anahtar sözcükleri olarak kullanılabilir.

Ayrıca bkz.

/Za, /Ze (Dil uzantılarını devre dışı bırak)
MSVC derleyici seçenekleri
MSVC derleyicisi komut satırı söz dizimi