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
static
yeniden 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 int
dışındaunsigned 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
, exp
cos
, , log
, log10
, , sin
sqrt
, ve tan
işlevlerinin atan
satı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