Aracılığıyla paylaş


Microsoft C/C++ değişiklik geçmişi 2003 - 2015

Bu makale, Visual Studio 2003'ten Visual Studio 2015'e kadar olan sürümlerdeki tüm uyumsuzluk yaratan değişiklikleri açıklar ve bu makalede "yeni davranış" veya "şimdi" terimleri Visual Studio 2015 ve sonraki sürümlere atıfta bulunur. "Eski davranış" ve "önce" terimleri Visual Studio 2013 ve önceki sürümlere başvurur.

Visual Studio'nun en son sürümü hakkında bilgi için bkz. Visual Studio'da C++ için yenilikler ve Visual Studio'da C++ uyumluluğu geliştirmeleri.

Not

Visual Studio 2015 ile Visual Studio 2017 arasında ikili uyumluluğu bozan hiçbir değişiklik yoktur.

Visual Studio'nun yeni bir sürümüne yükselttiğinizde, daha önce derlenen ve doğru şekilde çalıştırılan kodda derleme ve/veya çalışma zamanı hatalarıyla karşılaşabilirsiniz. Yeni sürümde bu tür sorunlara neden olan değişiklikler, hataya neden olan değişiklikler olarak bilinir ve genellikle C++ dil standardı, işlev imzaları veya bellekteki nesnelerin düzenindeki değişiklikler için gereklidir.

Algılaması ve tanılaması zor olan çalışma zamanı hatalarını önlemek için, derleyicinin farklı bir sürümü kullanılarak derlenen ikili dosyalara hiçbir zaman statik olarak bağlanmamanızı öneririz. Ayrıca, bir EXE veya DLL projesini yükseltirken, bağlantı verdiği kitaplıkları da yükselttiğinizden emin olun. Derleyicinin farklı sürümleri kullanılarak derlenen DLL'ler de dahil olmak üzere ikili dosyalar arasında CRT (C Çalışma Zamanı) veya C++ Standart Kitaplığı (C++ Standart Kitaplığı) türlerini geçirmeyin. Daha fazla bilgi için DLL Sınırları Boyunca CRT Nesnelerini Geçirirken Olası Hatalar bölümüne bakın.

COM arabirimi veya POD nesnesi olmayan bir nesne için belirli bir düzene bağımlı kod yazmamalısınız. Bu tür bir kod yazarsanız, yükseltme sonrasında çalışmasını sağlamalısınız. Daha fazla bilgi için bkz ABI Sınırlarında Taşınabilirlik.

Ayrıca, derleyici uyumluluğunda devam eden geliştirmeler bazen derleyicinin mevcut kaynak kodunuzu anlama biçimini değiştirebilir. Örneğin, derlemeniz sırasında yeni veya farklı hatalar, hatta daha önce derlenmiş ve düzgün çalışıyor gibi görünen kodda davranış farklılıkları bulabilirsiniz. Bu geliştirmeler, bu belgede açıklanan değişiklikler gibi önemli değişiklikler olmasa da, bu sorunları çözmek için kaynak kodunuzda değişiklik yapmanız gerekebilir:

Visual Studio 2015 Uyumluluk Değişiklikleri

C Çalışma Zamanı Kitaplığı (CRT)

Genel Değişiklikler

  • Yeniden düzenlenmiş ikili dosyalar

    CRT Kitaplığı, standart işlevlerin çoğunu içeren Evrensel CRT (ucrtbase) ve VC Runtime Kitaplığı (vcruntime) olmak üzere iki farklı ikili olarak yeniden yapılandırılmıştır. vcruntime kitaplığı, özel durum işleme ve iç bilgiler gibi derleyiciyle ilgili işlevleri içerir. Varsayılan proje ayarlarını kullanıyorsanız bağlayıcı yeni varsayılan kitaplıkları otomatik olarak kullandığından bu değişiklik sizi etkilemez. Projenin Bağlayıcı özelliğini Tüm Varsayılan Kitaplıkları Yoksay seçeneğini Evet olarak ayarladıysanız veya komut satırında bağlayıcı seçeneğini kullanıyorsanız/NODEFAULTLIB, kitaplık listenizi (Ek Bağımlılıklar özelliğinde) yeni, yeniden düzenlenmiş kitaplıkları içerecek şekilde güncelleştirmeniz gerekir. Eski CRT kitaplığını (libcmt.lib, libcmtd.lib, msvcrt.lib, msvcrtd.lib) eşdeğer yeniden düzenlenmiş kitaplıklarla değiştirin. Yeniden düzenlenmiş iki kitaplığın her biri için statik (.lib) ve dinamik (.dll) sürümleri ve yayın (son eki olmayan) ve hata ayıklama sürümleri ("d" son eki ile) vardır. Dinamik sürümler, bağlantı kurduğunuz bir içe aktarma kütüphanesine sahiptir. Yeniden düzenlenmiş iki kitaplık, Evrensel CRT ve VC çalışma zamanı kitaplığıdır. Evrensel CRT özellikle ucrtbase.dll veya ucrtbase.lib, ucrtbased.dll veya ucrtbased.lib dosyalarını içerir; VC çalışma zamanı kitaplığı ise libvcruntime.lib vcruntimeversion.dll, libvcruntimed.lib ve vcruntimedversion.dll dosyalarından oluşur. Hem Visual Studio 2015 hem de Visual Studio 2017'deki sürüm 140'tır. Bkz. CRT Kitaplığı Özellikleri.

<locale.h>

  • localeconv

    localeconv locale.h dosyasında bildirilen işlev, iş parçacığı başına yerel ayar etkinleştirildiğinde artık düzgün çalışıyor. Önceki kitaplık sürümlerinde, bu fonksiyon genel yerel ayarın lconv verilerini döndürürdü, iş parçacığının yerel ayarını değil.

    İş parçacığı başına yerel ayarlar kullanıyorsanız, localeconv kullanımınızı denetlemeniz gerekir. Kodunuz, döndürülen lconv verilerin küresel yerel ayar için olduğunu varsayıyorsa, düzeltmeniz gerekir.

<math.h>

  • Matematik kitaplığı işlevlerinin C++ aşırı yüklemeleri

    Önceki sürümlerde, <math.h> matematik kitaplığı işlevleri için C++ aşırı yüklemelerinin bazılarını tanımlamış ancak tümünü tanımlanmamıştır. Geri kalan aşırı yüklemeler <cmath> başlığındaydı. Yalnızca <math.h> içeren kod, işlev aşırı yükleme çözümlemesi sorunlarıyla karşılaşabilir. Artık C++ aşırı yüklemeleri <math.h> 'dan kaldırıldı ve yalnızca <cmath> içinde bulunur.

    Hataları çözmek için, <cmath> öğesinden kaldırılan işlevlerin bildirimlerini almak için ekleyin <math.h>. Bu işlevler taşındı:

    • double abs(double) ve float abs(float)
    • double pow(double, int), float pow(float, float), float pow(float, int), long double pow(long double, long double), , long double pow(long double, int)
    • float ve long double sürümlerindeki kayan nokta işlevleri acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, ceil, copysign, cos, cosh, erf, erfc, exp, exp2, expm1, fabs, fdim, floor, fma, fmax, fmin, fmod, frexp, hypot, ilogb, ldexp, lgamma, llrint, llround, log, log10, log1p, log2, lrint, lround, modf, nearbyint, nextafter, nexttoward, remainder, remquo, rint, round, scalbln, scalbn, sin, sinh, sqrt, tan, tanh, tgamma ve trunc

    Sadece <math.h> üst bilgisi içeren ve abs ile bir kayan nokta türü kullanan kodunuz varsa, kayan nokta sürümlerinin artık kullanılabilir olmayacağını unutmamanız gerekir. Çağrı, kayan nokta bağımsız değişkeni kullanıldığında bile artık abs(int) olarak çözümlenmektedir, bu da hataya neden olmaktadır.

    warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
    

    Bu uyarıyı düzeltmek için, abs çağrısını abs'in kayan nokta sürümüyle (örneğin, bir double argümanı için fabs veya bir float argümanı için fabsf) değiştirmeli ya da <cmath> üst başlığını dahil edip abs kullanmaya devam etmelisiniz.

  • Kayan nokta uyumluluğu

    IEEE-754 ve C11 Ek F belirtimlerine NaN'ler ve sonsuzluklar gibi özel durum girişleri bakımından uyumluluğu geliştirmek için matematik kitaplığında birçok değişiklik yapılmıştır. Örneğin, kitaplığın önceki sürümlerinde genellikle hata olarak ele alınan sessiz NaN girişleri artık hata olarak değerlendirilmez. Bkz. IEEE 754 Standardı ve C11 Standardı Ek F.

    Bu değişiklikler derleme zamanı hatalarına neden olmaz, ancak programların standarda göre farklı ve daha doğru davranmasına neden olabilir.

  • FLT_ROUNDS

    Visual Studio 2013'te FLT_ROUNDS makrosu sabit bir ifadeye genişletildi. Bu, yuvarlama modu çalışma zamanında yapılandırılabilir olduğu için hatalıydı, örneğin fesetround çağrısıyla. FLT_ROUNDS makro artık dinamiktir ve geçerli yuvarlama modunu doğru şekilde yansıtır.

<new> ve <new.h>

  • new ve delete

    Kitaplığın önceki sürümlerinde, uygulama tanımlı işleç yeni ve silme işlevleri çalışma zamanı kitaplığı DLL'sinden (örneğin, msvcr120.dll) dışarı aktarılmıştır. Bu işleç işlevleri artık çalışma zamanı kitaplığı DLL'leri kullanılırken bile ikili dosyalarınıza her zaman statik olarak bağlanır.

    Bu, yerel veya karma kod (/clr ) için hataya neden olan bir değişiklik değildir, ancak /clr:pure olarak derlenen kod için bu değişiklik kodunuzun derlenememasına neden olabilir. Kodu /clr:pure olarak derliyorsanız, bu değişiklikten kaynaklanan derleme hatalarını gidermek için #include <new> veya #include <new.h> eklemeniz gerekebilir. Bu/clr:pure seçenek Visual Studio 2015'te kullanım dışıdır ve Visual Studio 2017'de desteklenmez. "Saf" olması gereken kod C# olarak taşınabilir.

<process.h>

  • _beginthread ve _beginthreadex

    _beginthread ve _beginthreadex işlevleri artık iş parçacığının süresi boyunca iş parçacığı yordamının tanımlandığı modüle bir başvuru barındıracaktır. Bu, bir iş parçacığı tamamlanmak üzere çalıştırılana kadar modüllerin yüklenmemesini sağlamaya yardımcı olur.

<stdarg.h>

  • va_start ve başvuru türleri

    C++ kodu derlenirken, va_start artık derleme zamanında verilen bağımsız değişkenin referans türü olmadığını doğrular. C++ Standardı referans türü argümanlara izin vermez.

<stdio.h> ve <conio.h>

  • Printf ve scanf işlev ailesi artık satır içinde tanımlanmıştır.

    Tüm printf ve scanf işlevlerinin tanımları, diğer CRT üst bilgileri <stdio.h>, <conio.h> ve benzerlerine satır içi olarak taşındı. Bu hataya neden olan değişiklik, uygun CRT üst bilgilerini eklemeden bu işlevleri yerel olarak bildiren tüm programlar için bağlayıcı hatasına (LNK2019, çözümlenmemiş dış simge) yol açar. Mümkünse, kodu CRT üst bilgilerini (örneğin, #include <stdio.h> ekleyerek) ve satır içi işlevleri içerecek şekilde güncelleştirmeniz gerekir, ancak kodunuzu bu üst bilgi dosyalarını içerecek şekilde değiştirmek istemiyorsanız, alternatif bir çözüm olarak bağlayıcı girişinize legacy_stdio_definitions.lib eklemektir.

    Bu kitaplığı IDE'deki bağlayıcı girişinize eklemek için proje düğümünün bağlam menüsünü açın, Özellikler'i seçin, ardından Proje Özellikleri iletişim kutusunda Bağlayıcı'yı seçin ve Bağlayıcı Girişi'ni düzenleyerek listeye noktalı virgülle ayrılmış şekilde legacy_stdio_definitions.lib ekleyin.

    Projeniz 2015'ten önceki bir Visual Studio sürümüyle derlenmiş statik kitaplıklarla bağlantı kurarsa, bağlayıcı çözülmemiş bir dış simge bildirebilir. Bu hatalar, _iob, _iob_func, veya <stdio.h> gibi belirli imp* işlevler için ilgili iç tanımlara veya içeri aktarmalara referans verebilir. Microsoft, bir projeyi yükseltirken tüm statik kitaplıkları C++ derleyicisinin ve kitaplıklarının en son sürümüyle yeniden derlemenizi önerir. Üçüncü taraf bir kitaplığın kaynak kodu mevcut değilse, söz konusu üçüncü taraf sağlayıcıdan güncellenmiş bir ikili istemeli veya bu kitaplık kullanımınızı, derleyicinin ve kitaplıkların eski sürümüyle derlediğiniz ayrı bir DLL içinde kapsüllemelisiniz.

    Uyarı

    Windows SDK 8.1 veya önceki bir sürüme bağlanıyorsanız, bu çözülmemiş dış simge hatalarıyla karşılaşabilirsiniz. Bu durumda, daha önce açıklandığı gibi bağlayıcı girişine legacy_stdio_definitions.lib ekleyerek hatayı çözmeniz gerekir.

    Çözülmemiş simge hatalarını gidermek için dumpbin.exe kullanarak ikili dosyada tanımlanan simgeleri incelemeyi deneyebilirsiniz. Kitaplıkta tanımlanan simgeleri görüntülemek için aşağıdaki komut satırını deneyin.

    dumpbin.exe /LINKERMEMBER somelibrary.lib
    
  • gets ve _getws

    gets ve _getws işlevleri kaldırıldı. Gets işlevi, güvenli bir şekilde kullanılamadığından C11'deki C Standart Kitaplığı'ndan kaldırıldı. _getws işlevi, geniş dizeler için gets ile eşdeğer olan bir Microsoft uzantısıydı. Bu işlevlerin alternatifleri olarak fget, fgetws, gets_s ve _getws_s kullanmayı göz önünde bulundurun.

  • _cgets ve _cgetws

    _cgets ve _cgetws işlevleri kaldırıldı. Bu işlevlerin alternatifleri olarak _cgets_s ve _cgetws_s kullanmayı göz önünde bulundurun.

  • Sonsuzluk ve NaN Biçimlendirmesi

    Önceki sürümlerde, sonsuzlar ve NaN'ler MSVC'ye özgü sentinel dizeleri kullanılarak biçimlendirilirdi.

    • Sonsuzluk: 1.#INF

    • Sessiz NaN: 1.#QNAN

    • Sinyal NaN: 1.#SNAN

    • Belirsiz NaN: 1.#IND

    Bu biçimlerden herhangi biri başına bir işaret eklenmiş olabilir ve alan genişliği ile hassasiyetine bağlı olarak biraz farklı biçimlendirilmiş olabilir (bazen sıra dışı efektlerle, örneğin printf("%.2f\n", INFINITY) 1.#J yazdırılabilir çünkü #INF iki basamaklı duyarlılığa yuvarlandığı için). C99, sonsuzlukların ve NaN'lerin nasıl biçimlendirileceğine ilişkin yeni gereksinimler getirilmiştir. MSVC uygulaması artık bu gereksinimlere uygundur. Yeni dizeler aşağıdaki gibidir:

    • Sonsuzluk: inf

    • Sessiz NaN: nan

    • İşaretleyen NaN: nan(snan)

    • Belirsiz NaN: nan(ind)

    Bunlardan herhangi birinin ön eki bir işaret olabilir. Büyük harf biçim tanımlayıcısı (%f yerine (%F) kullanılırsa, dizeler gerektiği gibi büyük harfle (INF yerine inf) yazdırılır.

    Scanf işlevleri bu yeni dizeleri ayrıştıracak şekilde değiştirildiğinden, bu dizeler artık printf ve scanf üzerinden geri dönüş sağlayabilir.

  • Kayan nokta biçimlendirme ve ayrıştırma

    Doğruluğu geliştirmek için yeni kayan nokta biçimlendirme ve ayrıştırma algoritmaları kullanıma sunulmuştur. Bu değişiklik, printf ve scanf işlev ailelerini ve strtod gibi işlevleri etkiler.

    Eski biçimlendirme algoritmaları yalnızca sınırlı sayıda basamak oluşturur ve kalan ondalık basamakları sıfırla doldurur. Genellikle orijinal kayan nokta değerine geri dönüş yapacak dizeleri oluşturabilirlerdi, ancak tam değeri (veya ona en yakın ondalık gösterimi) istediğinizde iyi değildi. Yeni biçimlendirme algoritmaları, değeri temsil etmek veya belirtilen hassasiyeti doldurmak için gereken sayıda basamak oluşturur. İyileştirme örneği olarak; büyük iki'nin bir kuvvetini yazdırırken sonuçları göz önünde bulundurun.

    printf("%.0f\n", pow(2.0, 80))
    

    Eski çıkış:

    1208925819614629200000000
    

    Yeni çıkış:

    1208925819614629174706176
    

    Eski ayrıştırma algoritmaları giriş dizesinden en fazla 17 anlamlı basamak sayar ve kalan basamakları atar. Bu yaklaşım, dize tarafından temsil edilen değerin yakın tahminini oluşturmak için yeterlidir ve sonuç genellikle doğru yuvarlanmış sonuca çok yakındır. Yeni uygulama tüm mevcut basamakları dikkate alır ve tüm girişler için doğru yuvarlanmış sonucu üretir (en fazla 768 basamak uzunluğunda). Buna ek olarak, bu işlevler artık yuvarlama moduna (fesetround ile denetlenebilir) saygı gösterir. Bu, bu işlevlerin farklı sonuçlar verebileceğinden, olası bir sorun teşkil eden bir davranış değişikliği olabilir. Yeni sonuçlar her zaman eski sonuçlardan daha doğrudur.

  • Onaltılık ve sonsuz/NaN kayan nokta ayrıştırma

    Kayan nokta ayrıştırma algoritmaları artık yukarıda açıklandığı gibi onaltılık kayan nokta dizelerini (örneğin, %a ve %A printf biçim tanımlayıcıları tarafından oluşturulanlar) ve işlevler tarafından printf oluşturulan tüm sonsuz ve NaN dizelerini ayrıştıracak.

  • %A ve %a sıfır doldurma

    %a ve %A biçim tanımlayıcıları kayan nokta sayısını onaltılık mantis ve ikili üs olarak biçimlendirir. Önceki sürümlerde printf işlevler dizeleri hatalı şekilde sıfırla dolduruyordu. Örneğin, printf("%07.0a\n", 1.0) yanlış olarak 00x1p+0 yazdırırken doğru şekilde 0x01p+0 yazdırmalıdır. Bu kusur düzeltildi.

  • %A ve %a hassasiyet

    %A ve %a biçim tanımlayıcılarının varsayılan duyarlığı kitaplığın önceki sürümlerinde 6'ydı. Varsayılan duyarlık artık C Standardı ile uyumlu olması için 13'tür.

    Bu, %A veya %a ile bir biçim dizesi kullanan herhangi bir işlevin çıktısında yapılan çalışma zamanı davranışı değişikliğidir. Eski davranışta, %A tanımlayıcısını kullanan çıkış "1.1A2B3Cp+111" olabilir. Şimdi aynı değerin çıkışı "1.1A2B3C4D5E6F7p+111" olur. Eski davranışı almak için hassasiyeti belirtebilirsiniz, örneğin, %.6A. Bkz. Hassasiyet Özellikleri.

  • %F tanımlayıcısı

    %F biçim/dönüştürme tanımlayıcısı artık destekleniyor. Sonsuzlukların ve NaN'lerin büyük harfler kullanılarak biçimlendirilmelerinin dışında, işlev olarak %f biçim belirticisine eşdeğerdir.

    Önceki sürümlerde, F ve N'yi uzunluk değiştirici olarak ayrıştırmak için kullanılan uygulama. Segmentlere ayrılmış adres alanlarının yaşına kadar uzanan bu davranış: Bu uzunluk değiştiricileri sırasıyla %Fp veya %Ns'de olduğu gibi uzak ve yakın işaretçileri göstermek için kullanıldı. Bu davranış kaldırıldı. %F ile karşılaşılırsa, artık %F biçim tanımlayıcısı olarak kabul edilir; %N ile karşılaşılırsa, artık geçersiz bir parametre olarak kabul edilir.

  • Üstel biçimlendirme

    %e ve %E biçim tanımlayıcıları, bir kayan nokta sayısını ondalık bir mantis ve üs olarak biçimlendirir. %g ve %G biçim tanımlayıcıları da bazı durumlarda bu formdaki sayıları biçimlendirir. Önceki sürümlerde, CRT her zaman üstel değerleri üç basamaklı olan dizeler oluşturuyordu. Örneğin, printf("%e\n", 1.0) 1.000000e+000 yazdırılır ve bu yanlıştır. C, üs yalnızca bir veya iki basamak kullanılarak gösterilebilirse yalnızca iki basamak yazdırılmasını gerektirir.

    Visual Studio 2005'te genel uyumluluk anahtarı eklendi: _set_output_format. Bir program, uyumlu üstel yazdırmayı etkinleştirmek için bu işlevi _TWO_DIGIT_EXPONENT bağımsız değişkeniyle çağırabilir. Varsayılan davranış standartlara uygun üstel yazdırma moduna değiştirildi.

  • Biçem dizisi doğrulama

    Önceki sürümlerde printf ve scanf işlevleri, bazen olağan dışı efektler içeren birçok geçersiz biçim dizesini sessizce kabul ederdi. Örneğin, %hlhlhld %d olarak değerlendirilir. Tüm geçersiz biçim dizeleri artık geçersiz parametre olarak değerlendirilir.

  • fopen mod dizesi doğrulaması

    Önceki sürümlerde, fopen işlev ailesi gibi r+b+bazı geçersiz mod dizelerini sessizce kabul etti. Geçersiz mod dizeleri artık algılanıyor ve geçersiz parametre olarak işleniyor.

  • _O_U8TEXT modu

    _setmode işlevi artık in_O_U8TEXT modunda açılan akışlar için modu doğru raporlar. Kitaplığın önceki sürümlerinde, bu tür akışların _O_WTEXT olarak açık olduğunu bildirirdi.

    Kodunuz UTF-8 kodlamasına sahip akışlar için _O_WTEXT modunu yorumluyorsa, bu kritik bir değişikliktir. Uygulamanız UTF_8 desteklemiyorsa, giderek artan bu kodlama için destek eklemeyi göz önünde bulundurun.

  • snprintf ve vsnprintf

    Snprintf ve vsnprintf işlevleri artık uygulandı. Eski kod genellikle CRT kitaplığı tarafından uygulanmadığından, ancak daha yeni sürümlerde artık gerekli olmadığından bu işlevlerin makro sürümlerini tanımlar. Eğer snprintf veya vsnprintf, <stdio.h> eklenmeden önce bir makro olarak tanımlandıysa, makronun tanımlandığı yeri belirten bir hata ile derleme başarısız olur.

    Normalde, bu sorunun düzeltmesi kullanıcı kodundaki snprintf veya vsnprintf bildirimlerini silmektir.

  • tmpnam Kullanılabilir Dosya Adları Oluşturur

    Önceki sürümlerde, tmpnam ve tmpnam_s işlevleri, sürücünün kökünde (\sd3c. gibi) dosya adları oluşturmuştur. Bu işlevler artık geçici bir dizinde kullanılabilir dosya adı yolları oluşturur.

  • FILE Kapsüllemesi

    Önceki sürümlerde, tam DOSYA türü içinde <stdio.h>genel olarak tanımlanmıştı, bu nedenle kullanıcı kodunun bir FILE dosyasına ulaşması ve iç bileşenlerini değiştirmesi mümkündü. Kitaplık, uygulama ayrıntılarını gizleyecek şekilde değiştirildi. Bu değişikliğin bir parçası olarak, içinde <stdio.h> tanımlanan FILE artık opak bir türdür ve üyelerine CRT'nin dışından erişilemez.

  • _outp ve _inp

    _outp, _outpw, _outpd, _inp, _inpw ve _inpd işlevleri kaldırıldı.

<stdlib.h>, <malloc.h> ve <sys/stat.h>

  • strtof ve wcstof

    strtof ve wcstof işlevleri, değer bir kayan nokta olarak temsil edilemediğinde errno'yi ERANGE olarak ayarlamada başarısız oldu. Bu hata bu iki işleve özeldi; strtod, wcstod, strtoldve wcstold işlevleri etkilenmedi. Bu sorun düzeltildi ve bu, çalışma zamanı sırasında hatalara yol açan bir değişikliktir.

  • Hizalanmış ayırma işlevleri

    Önceki sürümlerde, hizalanmış ayırma işlevleri (_aligned_malloc, _aligned_offset_mallocvb.), 0 hizalamalı bir blok için istekleri sessizce kabul ederdi. İstenen hizalama, iki'nin kuvveti olmalıdır ve bu sıfır için geçerli değildir. İstenen 0 hizalaması artık geçersiz bir parametre olarak değerlendirilir. Bu sorun düzeltildi ve bu, çalışma zamanını etkileyen bir bozucu değişikliktir.

  • Yığın işlevleri

    _heapadd, _heapsetve _heapused işlevleri kaldırıldı. CRT, Windows yığınını kullanacak şekilde güncelleştirildiğinden beri bu işlevler işlevsizdir.

  • smallheap

    smallheap Bağlantı seçeneği kaldırıldı. Bkz. Bağlantı Seçenekleri.

  • _stat

    İşlev _stat ailesi, Visual Studio 2013 ve önceki sürümlerinde FindFirstFile yerine, Visual Studio 2015'te CreateFile kullanır. Bu, _stat eğik çizgi ile biten bir yol bir dizine atıfta bulunuyorsa başarılı olacağı anlamına gelir; bu, daha önce işlev errno, ENOENT olarak ayarlandığında hata verirdi.

<string.h>

  • wcstok

    İşlevin wcstok imzası, C Standard'ın gerektirdiğiyle eşleşecek şekilde değiştirildi. Kitaplığın önceki sürümlerinde bu işlevin imzası şöyleydi:

    wchar_t* wcstok(wchar_t*, wchar_t const*)
    

    Çağrılar arasında durumu izlemek için, strtok kadar, iş parçacığı başına bir iç bağlam kullandı. İşlevin artık imzası wchar_t* wcstok(wchar_t*, wchar_t const*, wchar_t**) vardır ve çağıranın, bağlamı işleve üçüncü bir parametre olarak geçirmesini gerektirir.

    Taşımayı kolaylaştırmak için eski imzayla yeni _wcstok bir işlev eklendi. C++ kodu derlenirken, eski imzaya sahip bir satır içi aşırı yükleme olan wcstok da vardır. Bu aşırı yükleme kullanım dışı olarak bildirilir. C kodunda, _wcstok yerine wcstok kullanılması için define_CRT_NON_CONFORMING_WCSTOK tanımlayabilirsiniz.

<time.h>

  • saat

    Önceki sürümlerde işlev, clock Windows API GetSystemTimeAsFileTimekullanılarak uygulanıyordu. Bu uygulamayla, saat işlevi sistem zamanına duyarlıydı ve bu nedenle monoton olması şart değildi. Saat işlevi QueryPerformanceCounter bağlamında yeniden uygulanmıştır ve artık tekdüzedir.

  • fstat ve _utime

    Önceki sürümlerde, _stat, fstatve _utime işlevleri yaz saati işlemlerini yanlış işler. Visual Studio 2013'ün öncesinde, bu işlevlerin tümü standart saat saatlerini yanlış bir şekilde gün ışığındaymış gibi ayarladı.

    Visual Studio 2013'te sorun işlev ailesinde _stat düzeltildi, ancak işlev ailelerindeki ve fstat ailelerindeki _utime benzer sorunlar düzeltilmedi. Bu kısmi düzeltme, işlevler arasındaki tutarsızlık nedeniyle sorunlara yol açtı. ve fstat_utime işlev aileleri artık düzeltilmiştir, bu nedenle bu işlevlerin tümü artık yaz saati işlemlerini doğru ve tutarlı bir şekilde gerçekleştirmektedir.

  • asctime

    Önceki sürümlerde, asctime işlevi, tek basamaklı günleri baştaki sıfırla doldururdu, örneğin: Fri Jun 06 08:00:00 2014. Spesifikasyon, bu tür günlerin Fri Jun 6 08:00:00 2014 gibi önlerinde bir boşlukla başlatılmasını gerektirir. Bu sorun düzeltilmiştir.

  • strftime ve wcsftime

    strftime ve wcsftime işlevleri artık %C, %D, %e, %F, %g, %G, %h, %n, %r, %R, %t, %T, %u ve %V biçim tanımlayıcılarını destekliyor. Ayrıca, E ve O değiştiricileri ayrıştırılır ancak yoksayılır.

    %c biçim belirticisi, geçerli yerel ayar için "uygun tarih ve saat gösterimi" sağlar. C yerel ayarında bu gösterimin %a %b %e %T %Y ile aynı olması ve asctime tarafından oluşturulan biçimle aynı olması gerekir. Önceki sürümlerde, %c biçim belirticisi bir MM/DD/YY HH:MM:SS gösterim kullanılarak zamanları yanlış bir şekilde biçimlendirmiştir. Bu sorun düzeltilmiştir.

  • timespec ve TIME_UTC

    Başlık <time.h> artık C11 Standart'ına göre timespec türünü ve timespec_get işlevini tanımlar. Buna ek olarak, TIME_UTC makrosu artık timespec_get işlevi ile kullanılmak üzere tanımlanmıştır. Bu güncelleme, bu tanımlayıcılardan herhangi biri için tanım çakışması olan kodlar için büyük bir değişikliktir.

  • CLOCKS_PER_SEC

    CLOCKS_PER_SEC makro artık C dilinin gerektirdiği şekilde türünde clock_tbir tamsayıya genişletiliyor.

C++ Standart Kitaplığı

Yeni iyileştirmeleri ve hata ayıklama denetimlerini etkinleştirmek için, C++ Standart Kitaplığı'nın Visual Studio uygulaması bir sürümden sonraki bir sürüme ikili uyumluluğu kasıtlı olarak bozar. Bu nedenle, C++ Standart Kitaplığı kullanıldığında, farklı sürümlerle derlenmiş nesne dosyaları ve statik kitaplıklar, tek bir ikili dosyada (EXE veya DLL) karıştırılamaz ve C++ Standart Kitaplığı nesneleri, farklı sürümlerde derlenmiş ikili dosyalar arasında aktarılamaz. Bu tür karışımlar, _MSC_VER uyuşmazlıklarıyla ilgili bağlayıcı (linker) hatalar verir. (_MSC_VER, derleyicinin ana sürümünü (örneğin, Visual Studio 2013 için 1800) içeren makrodur.) Bu denetim DLL karıştırmasını algılayamaz ve Visual Studio 2008 veya önceki sürümleri içeren karıştırmayı algılayamaz.

  • C++ Standart Kitaplığı dosyaları içerir

    C++ Standart Kitaplığı başlık dosyalarının ekleme yapısında bazı değişiklikler yapılmıştır. C++ Standartlar Kitaplığı'ndaki başlık dosyalarının, belirsiz şekillerde birbirini içermesine izin verilir. Genel olarak kodunuzu, C++ standardına göre ihtiyaç duyduğu tüm başlık dosyalarını dikkatlice dahil edecek şekilde yazmalısınız ve hangi C++ Standart Kütüphane başlık dosyasının hangi diğer C++ Standart Kütüphane başlık dosyasını içerdiğine bağımlı olmamalıdır. Bu, kodu sürümler ve platformlar arasında taşınabilir hale getirir. Visual Studio 2015'teki en az iki üst bilgi değişikliği kullanıcı kodunu etkiler. İlk olarak, <string> artık <iterator> öğesini içermez. İkinci olarak, <tuple> şu anda <array>'nin tamamını dahil etmeden std::array'i bildirir ve kodunuzun çalışmasını aşağıdaki kod yapılarının kombinasyonuyla bozabilir: Kodunuzda "array" adlı bir değişken varsa ve "using namespace std;" using-yönergesini kullanıyorsanız ve <tuple>'ü içeren bir C++ Standart Kütüphanesi başlığını (örneğin <functional> gibi) dahil ediyorsanız, bu da artık std::array'i bildirir.

  • steady_clock

    <chrono> uygulamasısteady_clock, kararlılık ve monotonluk için C++ Standart gereksinimlerini karşılayacak şekilde değişmiştir. steady_clock artık QueryPerformanceCounter'e dayanıyor ve high_resolution_clock, artık steady_clock için bir tür tanımıdır. Sonuç olarak, Visual Studio'da steady_clock::time_point artık için chrono::time_point<steady_clock>bir tür tanımıdır; ancak diğer uygulamalar için bu durum geçerli olmayabilir.

  • tahsis ediciler ve const

    Artık her iki tarafta da sabit bağımsız değişkenleri kabul etmek için ayırıcı eşitlik/eşitsizlik karşılaştırmaları gerekiyor. Ayırıcılarınız bu işleçleri böyle tanımlarsa,

    bool operator==(const MyAlloc& other)
    

    ardından bunları güncelleştirip const üyeleri olarak bildirmeniz gerekir:

    bool operator==(const MyAlloc& other) const
    
  • const öğeleri

    C++ standardı her zaman sabit öğelerin (veya vector<const T>gibiset<const T>) kapsayıcılarını yasaklamıştır. Visual Studio 2013 ve önceki sürümler bu tür kapsayıcıları kabul etti. Geçerli sürümde, bu tür kapsayıcılar derleme hatası veriyor.

  • std::allocator::deallocate

    Visual Studio 2013 ve önceki sürümlerinde, std::allocator::deallocate(p, n), n'e geçirilen argümanı yoksayardı. C++ standardı her zaman için allocate çağrısıyla elde edilen p'ye geri döndükten sonra, n değerinin bu çağrının ilk bağımsız değişkenine eşit olması gerektiğini gerektirir. Ancak geçerli sürümde n değeri incelenir. Standardın gerektirdiğinden farklı n değerlerini geçiren kod çalışma zamanında çökebilir.

  • hash_map ve hash_set

    Standart olmayan üst bilgi dosyaları <hash_map> ve <hash_set> Visual Studio 2015'te kullanım dışıdır ve gelecek bir sürümde kaldırılacaktır. <unordered_map> ve <unordered_set> kullanın bunun yerine.

  • karşılaştırıcılar ve operator()

    İlişkisel kapsayıcı tipleri ( <map> ailesi) artık karşılaştırıcılarının const çağrılabilir işlev operatörlerine sahip olmasını gerektirir. Bir karşılaştırıcı sınıf bildirimindeki aşağıdaki kod artık derlenemiyor:

    bool operator()(const X& a, const X& b)
    

    Bu hatayı düzeltmek için işlev bildirimini şu şekilde değiştirin:

    bool operator()(const X& a, const X& b) const
    
  • tip özellikleri

    C++ taslak standardının önceki bir sürümündeki tür özellikleri için eski adlar kaldırılmıştır. Bunlar C++11'de değiştirildi ve Visual Studio 2015'teki C++11 değerlerine güncelleştirildi. Aşağıdaki tabloda eski ve yeni adlar gösterilmektedir.

    Eski ad Yeni ad
    referans_ekle sol değer referansı ekle
    varsayılan_yapıcıya_sahip varsayılan olarak oluşturulabilir
    kopya oluşturucuya sahip kopya ile kurulanabilir
    taşıma kurucusuna sahip is_move_constructible (taşınabilir yapıcı)
    istisnasız yapıcı işlevi var is_nothrow_default_constructible (hatasız temel oluşturulabilir)
    istisnasız varsayılan oluşturucuya sahiptir is_nothrow_default_constructible (hatasız temel oluşturulabilir)
    has_nothrow_copy istisnasız kopya oluşturulabilir
    istisnasız kopya yapıcıya sahip istisnasız kopya oluşturulabilir
    has_nothrow_move_constructor (istisnasız taşıma yapıcısı var) is_nothrow_move_constructible
    hatasız_atama_yapabilir atılamaz_kopya_atanabilir_mi
    hatasız kopya atama fonksiyonu var atılamaz_kopya_atanabilir_mi
    nothrow taşıma ataması var mı noexcept_atamalı_hareket_edilebilir
    trivial_yapıcıya_sahip is_trivially_default_constructible (kolayca varsayılan olarak oluşturulabilir mi)
    önemsiz varsayılan kurucuya sahip is_trivially_default_constructible (kolayca varsayılan olarak oluşturulabilir mi)
    önemsiz kopyası var is_trivially_copy_constructible (kolayca kopyalanabilir yapıcıya sahip olma durumu)
    has_trivial_move_constructor (önemsiz taşıma yapıcısına sahip) is_trivially_move_constructible (önemli bir gereksinim olmadan taşınabilir yapıcıya sahip)
    Basit_atama_var özyinelemeli kopya ataması yapılabilir
    has_trivial_move_assign (önemsiz taşıma özdevinişe sahip) is_trivially_move_assignable (kolayca taşınabilir atama yapılabilir)
    önemsiz yıkıcıya sahiptir is_trivially_destructible (nesnenin kolayca yok edilebilir olduğunu belirten bir terim)
  • launch::any ve launch::sync ilkeleri

    Standart dışı launch::any ve launch::sync politikalar kaldırıldı. Bunun yerine launch::any yerine launch:async | launch:deferred kullanın. launch::sync için launch::deferred'i kullanın. Bkz launch Enumeration.

MFC ve ATL

  • Microsoft Foundation Sınıfları (MFC)

    artık büyük boyutu nedeniyle Visual Studio'nun "Tipik" yüklemesine dahil değildir. MFC'yi yüklemek için Visual Studio 2015 kurulumunda Özel yükleme seçeneğini belirleyin. Visual Studio 2015 zaten yüklüyse, Visual Studio kurulumunu yeniden çalıştırarak MFC'yi yükleyebilirsiniz. Özel yükleme seçeneğini ve ardından Microsoft Foundation Sınıfları'nı seçin. Visual Studio kurulumunu Programlar ve Özellikler'i Denetim Masası denetiminden veya yükleme medyasından çalıştırabilirsiniz.

    Visual C++ Yeniden Dağıtılabilir Paketi'nde bu kitaplık halen yer almaktadır.

Eşzamanlı Çalışma Zamanı

  • Windows.h'den concurrency::Context::Yield ile çakışan Yield makrosu

    Daha önce Eşzamanlılık Çalışma Zamanı, Windows.h h'de tanımlanan Verim makro ile işlev arasındaki çakışmaları önlemek için Verim makrosunun tanımlarını #undef silmek için kullanılırdıconcurrency::Context::Yield. Bu #undef kaldırıldı ve çakışma olmayan yeni bir eşdeğer API çağrısı olarak concurrency::Context::YieldExecution eklendi. Yield ile olan çakışmaları gidermek için, kodunuzu YieldExecution işlevini çağıracak şekilde güncelleyebilir veya çağrı yerlerinde Yield işlev adını parantez içine alabilirsiniz. Aşağıdaki örnekte olduğu gibi.

    (concurrency::Context::Yield)();
    

Visual Studio 2015'te Derleyici Uyumluluğu Geliştirmeleri

Önceki sürümlerden kod yükseltirken, Visual Studio 2015'te yapılan uyumluluk geliştirmelerinden kaynaklanan derleyici hatalarıyla da karşılaşabilirsiniz. Bu geliştirmeler, Visual Studio'nun önceki sürümlerindeki ikili uyumluluğu bozmaz, ancak daha önce oluşmayan derleyici hataları üretebilir. Daha fazla bilgi için bkz . Visual C++ Yenilikler 2003 ile 2015 arasında.

Visual Studio 2015'te, derleyici uyumluluğunda yapılan sürekli iyileştirmeler bazen derleyicinin mevcut kaynak kodunuzu anlama biçimini değiştirebilir. Sonuç olarak, derlemeniz sırasında yeni veya farklı hatalarla, hatta daha önce derlenmiş ve düzgün çalışıyor gibi görünen kodda davranış farklılıklarıyla karşılaşabilirsiniz.

Neyse ki bu farklılıklar kaynak kodunuzun çoğunu çok az etkiler veya hiç etkilemez. Bu farkları gidermek için kaynak kodu veya diğer değişiklikler gerektiğinde, düzeltmeler küçük ve doğrudan olma eğilimindedir. Önceden kabul edilebilir kaynak koduna ilişkin, değiştirilmesi (önce) gerekebilecek birçok örnek ve bunları düzeltmek için yapılan düzeltmeler (sonra) dahil ettik.

Bu farklılıklar kaynak kodunuzu veya diğer derleme yapıtlarınızı etkileyebilir ancak Visual Studio sürümlerine yönelik güncelleştirmeler arasındaki ikili uyumluluğu etkilemez. Kritik bir değişiklik daha ciddidir ve ikili uyumluluğu etkileyebilir, ancak bu tür ikili uyumluluk bozulmaları yalnızca Visual Studio'nun ana sürümleri arasında, örneğin Visual Studio 2013 ile Visual Studio 2015 arasında, meydana gelir. Visual Studio 2013 ile Visual Studio 2015 arasında meydana gelen uyumsuzluk yaratan değişiklikler hakkında bilgi için Visual Studio 2015 Uyumluluk Değişiklikleri'ne bakın.

Visual Studio 2015'te Uyumluluk Geliştirmeleri

  • /Zc:forScope- seçeneği

    Derleyici seçeneği /Zc:forScope- kullanım dışıdır ve gelecek bir sürümde kaldırılacaktır.

    Command line warning  D9035: option 'Zc:forScope-' has been deprecated and will be removed in a future release
    

    Genellikle bu seçenek, standart değere göre kapsamın dışına çıkmaları gereken noktadan sonra döngü değişkenlerini kullanan standart olmayan kodlara izin vermek için kullanılır. Yalnızca /Za seçeneğiyle derlendiğinde gerekliydi, çünkü /Za olmadan, döngünün sonundan sonra bir for döngüsü değişkeninin kullanılması her zaman izin verilir. Standart uyumluluğu önemsemiyorsanız (örneğin, kodunuz diğer derleyicilere taşınabilir değilse) seçeneğini kapatabilir /Za (veya Dil Uzantılarını Devre Dışı Bırak özelliğini Hayır olarak ayarlayabilirsiniz). Taşınabilir, standartlara uygun kod yazmaya önem veriyorsanız, bu tür değişkenlerin bildirimini döngü dışında bir noktaya taşıyarak kodunuzu standarda uyacak şekilde yeniden yazmanız gerekir.

    // C2065 expected
    int main() {
        // Uncomment the following line to resolve.
        // int i;
        for (int i = 0; i < 1; i++);
        i = 20;   // i has already gone out of scope under /Za
    }
    
  • /Zg derleyici seçeneği

    Derleyici /Zg seçeneği (İşlev Prototipleri Oluştur) artık kullanılamıyor. Bu derleyici seçeneği daha önce kullanım dışı bırakılmıştı.

  • C++/CLI ile birim testlerini artık mstest.exe ile komut satırından çalıştıramazsınız. Bunun yerine vstest.console.exe kullanın. Bkz. VSTest.Console.exe komut satırı seçenekleri.

  • mutable anahtar sözcüğü

    mutable Depolama sınıfı tanımlayıcısının daha önce hatasız derlendiği yerlerde artık izin verilmiyor. Şimdi derleyici C2071 (geçersiz depolama sınıfı) hatası veriyor. Standarda göre, mutable tanımlayıcı yalnızca sınıf veri üyelerinin adlarına uygulanabilir ve sabit veya statik olarak bildirilen adlara uygulanamaz ve başvuru üyelerine uygulanamaz.

    Örneğin, aşağıdaki kodu göz önünde bulundurun:

    struct S
    {
        mutable int &r;
    };
    

    Derleyicinin önceki sürümleri bunu kabul etti, ancak şimdi derleyici aşağıdaki hatayı veriyor:

    error C2071: 'S::r': illegal storage class
    

    Hatayı düzeltmek için yedekli mutable anahtar sözcüğü kaldırın.

  • char_16_t ve char32_t

    Artık char16_t veya char32_t'i typedef içinde diğer adlar olarak kullanamazsınız, çünkü bu türler artık yerleşik türler olarak kabul ediliyor. Kullanıcıların ve kitaplık yazarlarının char16_t ve char32_t'yi sırasıyla uint16_t ve uint32_t'ün diğer adları olarak tanımlaması yaygın bir durumdu.

    #include <cstdint>
    
    typedef uint16_t char16_t; //C2628
    typedef uint32_t char32_t; //C2628
    
    int main(int argc, char* argv[])
    {
        uint16_t x = 1; uint32_t y = 2;
        char16_t a = x;
        char32_t b = y;
        return 0;
    }
    

    Kodunuzu güncelleştirmek için typedef bildirimlerini kaldırın ve bu adlarla çakışan diğer tanımlayıcıları değiştirin.

  • Tip olmayan şablon parametreleri

    Tip dışı şablon parametreleri içeren belirli kodlar, açık şablon argümanları sağladığınızda tür uyumluluğu açısından artık doğru bir şekilde denetlenmektedir. Örneğin, aşağıdaki kod Visual Studio'nun önceki sürümlerinde hatasız derlenmiştir.

    struct S1
    {
        void f(int);
        void f(int, int);
    };
    
    struct S2
    {
        template <class C, void (C::*Function)(int) const> void f() {}
    };
    
    void f()
    {
        S2 s2;
        s2.f<S1, &S1::f>();
    }
    

    Şablon parametre türü şablon bağımsız değişkeniyle uyuşmadığından mevcut derleyici gerekli hatayı veriyor (parametre bir sabit üyenin işaretçisidir, ancak f işlevi sabit değildir):

    error C2893: Failed to specialize function template 'void S2::f(void)'note: With the following template arguments:note: 'C=S1'note: 'Function=S1::f'
    

    Kodunuzdaki bu hatayı gidermek için kullandığınız şablon bağımsız değişkeninin türünün, şablon parametresinin bildirilen türüyle eşleştiğinden emin olun.

  • __declspec(align)

    Derleyici artık __declspec(align) ifadesini işlevlerde kabul etmemektedir. Bu yapı her zaman yoksayılıyordu, ancak şimdi bir derleyici hatasına neden oluyor.

    error C3323: 'alignas' and '__declspec(align)' are not allowed on function declarations
    

    Bu sorunu düzeltmek için işlev bildiriminden kaldırın __declspec(align) . Hiçbir etkisi olmadığından, kaldırmak hiçbir şeyi değiştirmez.

  • Hata yönetimi

    Özel durum işlemede birkaç değişiklik vardır. İlk olarak, özel durum nesnelerinin kopyalanabilir veya taşınabilir olması gerekir. Aşağıdaki kod Visual Studio 2013'te derlenmiş ancak Visual Studio 2015'te derlenemez:

    struct S
    {
    public:
        S();
    private:
        S(const S &);
    };
    
    int main()
    {
        throw S(); // error
    }
    

    Sorun, kopya oluşturucunun özel olmasıdır, bu nedenle nesne bir özel durumu işlemenin normal sırasında olduğu gibi kopyalanamaz. Aynı durum, kopya oluşturucu bildirildiğinde explicitde geçerlidir.

    struct S
    {
        S();
        explicit S(const S &);
    };
    
    int main()
    {
        throw S(); // error
    }
    

    Kodunuzu güncellemek için, özel durum nesnenizin kopya oluşturucusunun public olduğundan ve explicit olarak işaretlenmediğinden emin olun.

    Bir özel durumun değere göre yakalanması, özel durum nesnesinin de kopyalanabilir olmasını gerektirir. Aşağıdaki kod Visual Studio 2013'te derlenmiş ancak Visual Studio 2015'te derlenemez:

    struct B
    {
    public:
        B();
    private:
        B(const B &);
    };
    
    struct D : public B {};
    
    int main()
    {
        try
        {
        }
        catch (D d) // error
        {
        }
    }
    

    catch için parametre türünü bir başvuru olarak değiştirerek bu sorunu düzeltebilirsiniz.

    catch (D& d)
    {
    }
    
  • Dize değişmez değerleri ve ardından makrolar

    Derleyici artık kullanıcı tanımlı değişmez değerleri destekliyor. Sonuç olarak, araya boşluk girmeksizin makroları takip eden dize değişmezleri, kullanıcı tanımlı değişmez değerler olarak yorumlanır ve bu da hatalara veya beklenmeyen sonuçlara yol açabilir. Örneğin, önceki derleyicilerde aşağıdaki kod başarıyla derlenmiş:

    #define _x "there"
    char* func() {
        return "hello"_x;
    }
    int main()
    {
        char * p = func();
        return 0;
    }
    

    Derleyici bu kodu bir string literal "hello" ve ardından "there" olarak genişletilen bir makro olarak yorumladı. Sonra bu iki string literal birleştirildi. Visual Studio 2015'te derleyici bu diziyi kullanıcı tanımlı değişmez değer olarak yorumlar, ancak eşleşen kullanıcı tanımlı değişmez değer _x tanımlanmadığından hata verir.

    error C3688: invalid literal suffix '_x'; literal operator or literal operator template 'operator ""_x' not found
    note: Did you forget a space between the string literal and the prefix of the following string literal?
    

    Bu sorunu çözmek için karakter dizisi ile makro arasına bir boşluk ekleyin.

  • Bitişik dize sabitleri

    Öncekine benzer şekilde, dize ayrıştırmadaki ilgili değişiklikler nedeniyle, herhangi bir boşluk olmadan bitişik dize değişmez değerleri (geniş veya dar karakter dizesi değişmez değerleri) Visual C++'ın önceki sürümlerinde tek bir birleştirilmiş dize olarak yorumlandı. Visual Studio 2015'te artık iki dize arasına boşluk eklemeniz gerekir. Örneğin, aşağıdaki kod değiştirilmelidir:

    char * str = "abc""def";
    

    Bu sorunu çözmek için iki dize arasına bir boşluk ekleyin:

    char * str = "abc" "def";
    
  • Yeni yerleştirme ve silme

    C++14 standardına uygun hale getirmek için işleçte bir değişiklik yapılmıştır delete . Standart değişikliğinin ayrıntıları C++ Sized Deallocation adresinde bulunabilir. Değişiklikler, boyut parametresini alan genel delete işlecin biçimini ekler. Bozucu değişiklik, daha önce aynı imzaya sahip bir operatör kullandıysanız (yerleştirme yeni operatörüne delete karşılık gelecek şekilde) bir derleyici hatası (C2956) alacağınızdır. Bu hata, yerleştirme yenisinin kullanıldığı noktada oluşur çünkü bu, derleyicinin uygun bir eşleştirme delete operatörünü tanımlamaya çalıştığı kod konumudur.

    İşlev void operator delete(void *, size_t), C++11'deki void * operator new(size_t, size_t)yerleştirme yeni işlevine karşılık gelen bir yerleştirme silme işleciydi. C++14 boyutlu serbest bırakma ile bu silme işlevi artık normal bir serbest bırakma işlevidir (genel delete işleç). Standart, yeni yerleştirme kullanımı karşılık gelen bir silme işlevini ararsa ve normal bir serbest bırakma işlevi bulursa, programın kötü biçimlendirilmiş olmasını gerektirir.

    Örneğin, kodunuzun hem bir placement new hem de bir placement delete tanımladığını varsayalım:

    void * operator new(std::size_t, std::size_t);
    void operator delete(void*, std::size_t) noexcept;
    

    Sorun, tanımladığınız bir yerleştirme silme işleci ile yeni genel boyutlu delete işleç arasındaki işlev imzalarındaki eşleşme nedeniyle oluşur. size_t dışında herhangi bir yerleştirme 'new' ve işleçleri için farklı bir tür kullanıp kullanamayacağınızı düşünün. türü size_ttypedef derleyiciye bağımlıdır; MSVC'de unsigned int için typedef şeklindedir. bunun gibi numaralandırılmış bir tür kullanmak iyi bir çözümdür:

    enum class my_type : size_t {};
    

    Ardından, placement new tanımınızı değiştirin ve size_t yerine ikinci bağımsız değişken olarak bu türü kullanın. Ayrıca, yeni türü geçirmek için placement new çağrılarını güncelleştirmeniz (örneğin, tamsayı değerinden dönüştürmek için static_cast<my_type> kullanarak) ve delete'yi tamsayı türüne geri döndürmek için new ve delete tanımını güncelleştirmeniz gerekir. Bunun için bir enum kullanmanız gerekmez; üyesi olan bir size_t sınıf türü de çalışır.

    Alternatif bir çözüm, placement new'u tamamen ortadan kaldırabilmenizdir. Kodunuzda ayrılan veya silinen nesnenin boyutunu bir bağımsız değişken olarak alan bir bellek havuzu uygulamak için placement new kullanılıyorsa, boyutlandırılmış serbest bırakma özelliği kendi özel bellek havuzu kodunuzu değiştirmeye uygun olabilir. Bu durumda, yerleştirme işlevlerinden kurtulabilir ve yerleştirme işlevleri yerine kendi iki bağımsız değişkenli delete işlecinizi kullanabilirsiniz.

    Kodunuzu hemen güncelleştirmek istemiyorsanız, derleyici seçeneğini /Zc:sizedDealloc-kullanarak eski davranışa geri dönebilirsiniz. Bu seçeneği kullanırsanız, iki bağımsız değişkenli silme işlevleri yoktur ve placement delete işlecinizle çakışmaya neden olmaz.

  • Birleşim veri üyeleri

    Birleşimlerin veri üyeleri artık referans türlerine sahip olamaz. Aşağıdaki kod Visual Studio 2013'te başarıyla derlenmiş ancak Visual Studio 2015'te bir hata üretir.

    union U1
    {
        const int i;
    };
    union U2
    {
        int & i;
    };
    union U3
    {
        struct { int & i; };
    };
    

    Yukarıdaki kod aşağıdaki hataları oluşturur:

    test.cpp(67): error C2625: 'U2::i': illegal union member; type 'int &' is reference type
    test.cpp(70): error C2625: 'U3::i': illegal union member; type 'int &' is reference type
    

    Bu sorunu gidermek için başvuru türlerini işaretçi veya değer olarak değiştirin. Türü işaretçi olarak değiştirmek için birleşim alanını kullanan kodda değişiklik yapılması gerekir. Kodun bir değere değiştirilmesi birleşimde depolanan verileri değiştirir ve birleşim türlerindeki alanlar aynı belleği paylaştığından diğer alanları etkiler. Değerin boyutuna bağlı olarak birleşim boyutunu da değiştirebilir.

  • Anonim birleşimler artık standarda daha uygun. Derleyicinin önceki sürümleri anonim birleşimler için açık bir oluşturucu ve yıkıcı oluşturdu. Derleyici tarafından oluşturulan bu işlevler Visual Studio 2015'te silinir.

    struct S
    {
        S();
    };
    
    union
    {
        struct
        {
            S s;
        };
    } u; // C2280
    

    Yukarıdaki kod, Visual Studio 2015'te aşağıdaki hatayı oluşturur:

    error C2280: '<unnamed-type-u>::<unnamed-type-u>(void)': attempting to reference a deleted function
    note: compiler has generated '<unnamed-type-u>::<unnamed-type-u>' here
    

    Bu sorunu çözmek için oluşturucu ve/veya yıkıcının kendi tanımlarını sağlayın.

    struct S
    {
        // Provide a default constructor by adding an empty function body.
        S() {}
    };
    
    union
    {
        struct
        {
            S s;
        };
    } u;
    
  • Anonim yapılara sahip birleşimler

    Standarda uymak amacıyla birleşimlerdeki anonim yapıların üyelerinin çalışma zamanı davranışı değiştirildi. Bir birleşimdeki anonim yapı üyeleri için oluşturucu, böyle bir birleşim oluşturulduğunda artık örtük olarak çağrılmaz. Ayrıca, bir birleşimdeki anonim yapı üyeleri için yok edici artık birleşim kapsamdan çıktığında örtük olarak çağrılmaz. U birleşiminin, içinde yıkıcısı olan adlandırılmış bir üye yapısı S bulunan anonim bir yapı içerdiği aşağıdaki kodu göz önünde bulundurun.

    #include <stdio.h>
    struct S
    {
        S() { printf("Creating S\n"); }
        ~S() { printf("Destroying S\n"); }
    };
    union U
    {
        struct {
            S s;
        };
        U() {}
        ~U() {}
    };
    
    void f()
    {
        U u;
        // Destructor implicitly called here.
    }
    
    int main()
    {
        f();
    
        char s[1024];
        printf("Press any key.\n");
        gets_s(s);
        return 0;
    }
    

    Visual Studio 2013'te, birleşim oluşturulduğunda S'nin kurucusu çağrılır ve f işlevinin yığını temizlendiğinde S'nin yıkıcısı çağrılır. Ancak Visual Studio 2015'te oluşturucu ve yıkıcı çağrılmaz. Derleyici bu davranış değişikliği hakkında bir uyarı verir.

    warning C4587: 'U::s': behavior change: constructor is no longer implicitly calledwarning C4588: 'U::s': behavior change: destructor is no longer implicitly called
    

    Özgün davranışı geri yüklemek için anonim yapıya bir ad verin. Anonim olmayan yapıların çalışma zamanı davranışı, derleyici sürümünden bağımsız olarak aynıdır.

    #include <stdio.h>
    
    struct S
    {
        S() { printf("Creating S.\n"); }
        ~S() { printf("Destroying S\n"); }
    };
    union U
    {
        struct
        {
            S s;
        } namedStruct;
        U() {}
        ~U() {}
    };
    
    void f()
    {
        U u;
    }
    
    int main()
    {
        f();
    
        char s[1024];
        printf("Press any key.\n");
        gets_s(s);
        return 0;
    }
    

    Alternatif olarak, oluşturucu ve yıkıcı kodunu yeni işlevlere taşımayı deneyin ve birleşim için oluşturucu ve yıkıcıdan bu işlevlere çağrılar ekleyin.

    #include <stdio.h>
    
    struct S
    {
        void Create() { printf("Creating S.\n"); }
        void Destroy() { printf("Destroying S\n"); }
    };
    union U
    {
        struct
        {
            S s;
        };
        U() { s.Create(); }
        ~U() { s.Destroy(); }
    };
    
    void f()
    {
        U u;
    }
    
    int main()
    {
        f();
    
        char s[1024];
        printf("Press any key.\n");
        gets_s(s);
        return 0;
    }
    
  • Şablon çözünürlüğü

    Şablonlar için ad çözümlemesinde değişiklikler yapılmıştır. C++'ta, bir adın çözümlenmesi için adaylar dikkate alınırken, olası eşleşmeler geçersiz bir şablon örneklemesi oluşturduğundan dikkate alınacak bir veya daha fazla adın olması söz konusu olabilir. Bu geçersiz örneklemeler normalde SFINAE (Değiştirme Hatası Bir Hata Değildir) olarak bilinen bir ilke olan derleyici hatalarına neden olmaz.

    Şimdi, SFINAE derleyicinin bir sınıf şablonunun uzmanlığını oluşturmasını gerektiriyorsa, bu işlem sırasında oluşan hatalar derleyici hatalarıdır. Önceki sürümlerde derleyici bu tür hataları yoksayacaktı. Örneğin, aşağıdaki kodu göz önünde bulundurun:

    #include <type_traits>
    
    template< typename T>
    struct S
    {
        S() = default;
        S(const S&);
        S(S& &);
    
        template< typename U, typename = typename std::enable_if< std::is_base_of< T, U> ::value> ::type>
        S(S< U> & &);
    };
    
    struct D;
    
    void f1()
    {
        S< D> s1;
        S< D> s2(s1);
    }
    
    struct B
    {
    };
    
    struct D : public B
    {
    };
    
    void f2()
    {
        S< D> s1;
        S< D> s2(s1);
    }
    

    Geçerli derleyiciyle derlerseniz aşağıdaki hatayı alırsınız:

    type_traits(1110): error C2139: 'D': an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_base_of'
    ..\t331.cpp(14): note: see declaration of 'D'
    ..\t331.cpp(10): note: see reference to class template instantiation 'std::is_base_of<T,U>' being compiled
    with
    [
        T=D,
        U=D
    ]
    

    Bunun nedeni, sınıf D henüz tanımlanmamış olduğundan, is_base_of'un ilk çağrıldığı noktada tanımsız olmasıdır.

    Bu durumda, düzeltme, sınıf tanımlanana kadar bu tür özellikleri kullanmamaktır. ve B tanımlarını D kod dosyasının başına taşırsanız hata çözülür. Tanımlar üst bilgi dosyalarındaysa, sorunlu şablonlar kullanılmadan önce tüm sınıf tanımlarının derlendiğinden emin olmak için üst bilgi dosyalarının include deyimlerinin sırasını denetleyin.

  • Oluşturucuları kopyalama

    Hem Visual Studio 2013'te hem de Visual Studio 2015'te, bu sınıfın kullanıcı tanımlı bir taşıma oluşturucusunun olması ancak kullanıcı tanımlı kopya oluşturucunun olmaması durumunda derleyici sınıf için bir kopya oluşturucu oluşturur. Dev14'te, örtük olarak oluşturulan bu kopya oluşturucu da "= delete" olarak işaretlenir.

  • extern "C" olarak bildirilen main artık bir dönüş türü gerektiriyor.

    Aşağıdaki kod artık C4430 üretir.

    extern "C" __cdecl main(){} // C4430
    

    Hatayı düzeltmek için dönüş türünü ekleyin:

    extern "C" int __cdecl main(){} // OK
    
  • Üye başlatıcıda typename'e izin verilmiyor

    Aşağıdaki kod artık C2059 üretir:

    template<typename T>
    struct S1 : public T::type
    {
        S1() : typename T::type() // C2059
        {
        }
    };
    
    struct S2 {
        typedef S2 type;
    };
    
    S1<S2> s;
    

    Hatayı düzeltmek için başlatıcıdan kaldırın typename :

    S1() : T::type() // OK
    ...
    
  • Açık özelleştirmelerdeki depolama sınıfı yoksayılır.

    Aşağıdaki kodda statik depolama sınıfı tanımlayıcısı yoksayılır

    template <typename T>
    void myfunc(T h)
    {
    }
    
    template<>
    static void myfunc(double h) // static is ignored
    {
    }
    
  • Sınıf şablonunun içindeki bir static_assert kullanılan sabit her zaman başarısız olur.

    Aşağıdaki kod, öğesinin static_assert her zaman başarısız olmasına neden olur:

    template <size_t some_value>
    struct S1
    {
        static_assert(false, "default not valid"); // always invoked
    
    };
    
    //other partial specializations here
    

    Bu soruna geçici bir çözüm bulmak için değeri bir struct içinde sararak:

    template <size_t some_value>
    struct constant_false {
        static const bool value = false;
    };
    
    template <size_t some_value>
    struct S1
    {
        static_assert(constant_false<some_value>::value, "default not valid");
    };
    
    //other partial specializations here
    
  • İleriye dönük bildirimler için zorunlu kılınan kurallar. (Yalnızca C için geçerlidir.)

    Aşağıdaki kod artık C2065 üretir:

    struct token_s;
    typedef int BOOL;
    typedef int INT;
    
    typedef int(*PFNTERM)(PTOKEN, BOOL, INT); // C2065: 'PTOKEN' : undeclared identifier
    

    Bu sorunu düzeltmek için uygun iletme bildirimlerini ekleyin:

    struct token_s;
    typedef int BOOL;
    typedef int INT;
    
    // forward declarations:
    typedef struct token_s TOKEN;
    typedef TOKEN *PTOKEN;
    
    typedef int(*PFNTERM)(PTOKEN, BOOL, INT);
    
  • İşlev işaretçisi türlerinin daha tutarlı bir şekilde uygulanması

    Aşağıdaki kod artık C2197 üretir:

    typedef int(*F1)(int);
    typedef int(*F2)(int, int);
    
    void func(F1 f, int v1, int v2)
    {
        f(v1, v2); // C2197
    }
    
  • Aşırı yüklenmiş işlevlere belirsiz çağrılar

    Şu kod artık C266 üretir: 'N::bind': aşırı yüklenmiş işleve belirsiz çağrı

    template<typename R, typename T, typename T1, typename A1>
    void bind(R(T::*)(T1), A1&&);
    
    namespace N
    {
        template <typename T, typename R, typename ... Tx>
        void bind(R(T::*)(Tx...), T* ptr);
    }
    
    using namespace N;
    
    class Manager
    {
    public:
        void func(bool initializing);
    
        void mf()
        {
            bind(&Manager::func, this); //C2668
        }
    };
    

    Hatayı düzeltmek için bind: N::bind(...) çağrısını tam niteleyebilirsiniz. Ancak, bu değişiklik bildirilmemiş bir tanımlayıcı (C2065) aracılığıyla bildiriliyorsa, bunun yerine bir using bildirimle düzeltmek uygun olabilir.

    Bu desen, ComPtr ve Microsoft::WRL ad alanı içindeki diğer türlerde sık sık gerçekleşir.

  • Yanlış adresi düzelt

    Şu kod artık C2440 üretmektedir: '=': 'type *' türünden 'type' türüne dönüştürülemez. Hatayı düzeltmek için &(tür) değerini (tür) ve (&f()) değerini (f()) olarak değiştirin.

    // C
    typedef void (*type)(void);
    
    void f(int i, type p);
    void g(int);
    void h(void)
    {
        f(0, &(type)g);
    }
    
    // C++
    typedef void(*type)(void);
    
    type f();
    
    void g(type);
    
    void h()
    {
        g(&f());
    }
    
  • Dize sabiti sabit bir dizidir

    Şu kod artık C2664 hatasını oluşturur: 'void f(void )': 1. bağımsız değişkeni 'const char ()[2]' ifadesinden 'void *' türüne dönüştürülemez.

    void f(void *);
    
    void h(void)
    {
        f(&__FUNCTION__);
        void *p = &"";
    }
    

    Hatayı düzeltmek için işlev parametre türünü const void*olarak değiştirin veya gövdesini h şu örneğe benzer şekilde değiştirin:

    void h(void)
    {
        char name[] = __FUNCTION__;
        f( name);
        void *p = &"";
    }
    
  • C++11 UDL dizeleri

    Aşağıdaki kod artık C3688 hatası üretir: geçersiz bir harf eki 'L'; harf işleci veya harf işleci şablonu 'işleç ""L' bulunamadı

    #define MACRO
    
    #define STRCAT(x, y) x\#\#y
    
    int main(){
    
        auto *val1 = L"string"MACRO;
        auto *val2 = L"hello "L"world";
    
        std::cout << STRCAT(L"hi ", L"there");
    }
    

    Hatayı düzeltmek için kodu değiştirerek bir alan ekleyin:

    #define MACRO
    
    // Remove ##. Strings are automatically
    // concatenated so they aren't needed
    #define STRCAT(x, y) x y
    
    int main(){
        //Add space after closing quote
        auto *val1 = L"string" MACRO;
        auto *val2 = L"hello " L"world";
    
        std::cout << STRCAT(L"hi ", L"there");
    }
    

    Yukarıdaki örnekte, MACRO artık iki belirteç (bir dize ve ardından bir makro) olarak ayrıştırılmış değildir. Şimdi tek bir belirteç UDL şeklinde ayrıştırılır. Aynı durum, daha önce L"" ve L"" olarak ayrıştırılan ve şimdi L""L ve "" olarak ayrıştırılan L""L"" için de geçerlidir.

    Dize birleştirme kuralları da standartla uyumlu bir şekilde getirilmiştir, yani L"a" "b" L"ab" ile eşdeğerdir. Visual Studio'nun önceki sürümleri, farklı karakter genişliğine sahip dizelerin birleştirilme işlemini kabul etmedi.

  • C++11 boş karakter kaldırıldı

    Aşağıdaki kod artık C2137 hatası üretir: boş karakter sabiti

    bool check(wchar_t c){
        return c == L''; //implicit null character
    }
    

    Hatayı düzeltmek için kodu null değerini açık olacak şekilde değiştirin:

    bool check(wchar_t c){
        return c == L'\0';
    }
    
  • MFC istisnaları kopyalanamaz olduğundan değer olarak yakalanamaz

    MFC uygulamasındaki aşağıdaki kod artık C2316 hatasına neden oluyor: 'D': yıkıcı ve/veya kopya oluşturucu erişilemez veya silindiğinden yakalanamaz

    struct B {
    public:
        B();
    private:
        B(const B &);
    };
    
    struct D : public B {
    };
    
    int main()
    {
        try
        {
        }
        catch (D) // C2316
        {
        }
    }
    

    Kodu düzeltmek için catch bloğunu catch (const D &) olarak değiştirebilirsiniz, ancak en iyi çözüm genellikle MFC TRY/CATCH makrolarını kullanmaktır.

  • alignof artık bir anahtar sözcük

    Aşağıdaki kod artık C2332 hatası üretir: 'class': etiket adı eksik. Kodu düzeltmek için sınıfı yeniden adlandırmanız veya sınıfı ile aynı işi alignofyapıyorsa sınıfını yeni anahtar sözcükle değiştirmeniz gerekir.

    class alignof{}
    
  • constexpr artık bir anahtar sözcük

    Aşağıdaki kod artık C2059 hatası üretir: söz dizimi hatası: ')'. Kodu düzeltmek için adlı constexprişlev veya değişken adlarını yeniden adlandırmanız gerekir.

    int constexpr() {return 1;}
    
  • Taşınabilir türler sabit olamaz

    Bir fonksiyon, taşınması amaçlanan bir tür döndürdüğünde, geri dönüş tipi const olmamalıdır.

  • Silinen kopya oluşturucuları

    Aşağıdaki kod artık C2280 'S::S(S&&)' üretir: silinen bir işleve başvurmaya çalışıyor:

    struct S{
        S(int, int);
        S(const S&) = delete;
        S(S&&) = delete;
    };
    
    S s2 = S(2, 3); //C2280
    

    Hatayı düzeltmek için S2 doğrudan başlatmayı kullanın.

    struct S{
        S(int, int);
        S(const S&) = delete;
        S(S&&) = delete;
    };
    
    S s2 = {2,3}; //OK
    
  • lambda yakalamaları olmadığında yalnızca işlev işaretçisine dönüştürme oluşturulur

    Aşağıdaki kod Visual Studio 2015'te C2664 oluşturur.

    void func(int(*)(int)) {}
    
    int main() {
    
        func([=](int val) { return val; });
    }
    

    Hatayı düzeltmek için = öğesini yakalama listesinden kaldırın.

  • Dönüşüm operatörlerini içeren belirsiz çağrılar

    Şu kod artık C2440 hatasını üretir: 'tür ataması': 'S2'den 'S1'e dönüştürülemez:

    struct S1 {
        S1(int);
    };
    
    struct S2 {
        operator S1();
        operator int();
    };
    
    void f(S2 s2)
    {
        (S1)s2;
    }
    

    Hatayı düzeltmek için dönüştürme işlecini açıkça çağırın:

    void f(S2 s2)
    {
        //Explicitly call the conversion operator
        s2.operator S1();
        // Or
        S1((int)s2);
    }
    

    Şu kod artık C2593 hatası üretir: 'operator =' belirsiz:

    struct S1 {};
    
    struct S2 {
        operator S1&();
        operator S1() const;
    };
    
    void f(S1 *p, S2 s)
    {
        *p = s;
    }
    

    Hatayı düzeltmek için dönüştürme işlecini açıkça çağırın:

    void f(S1 *p, S2 s)
    {
        *p = s.operator S1&();
    }
    
  • Statik olmayan veri üyesi başlatmasında (NSDMI) geçersiz kopya başlatmayı düzelt

    Şu kod artık C2664 hatasını üretir: 'S1::S1(S1 &)': 'bool' olan bağımsız değişken 1'i 'const S1 &' değerine dönüştüremez:

    struct S1 {
        explicit S1(bool);
    };
    
    struct S2 {
        S1 s2 = true; // error
    };
    

    Hatayı düzeltmek için doğrudan başlatmayı kullanın:

    struct S2 {
    S1 s1{true}; // OK
    };
    
  • Decltype deyimleri içindeki oluşturuculara erişme

    Aşağıdaki kod artık C2248 hatasını verir: 'S::S': 'S' sınıfında bildirilen özel üyeye erişilemiyor:

    class S {
        S();
    public:
        int i;
    };
    
    class S2 {
        auto f() -> decltype(S().i);
    };
    

    Hatayı düzeltmek için S2 içinde S bir arkadaş bildirimi ekleyin:

    class S {
        S();
        friend class S2; // Make S2 a friend
    public:
        int i;
    };
    
  • Lambda'nın varsayılan ctor'ı örtük olarak silinir

    Aşağıdaki kod artık C3497 hatası üretir: lambda örneği oluşturamazsınız:

    void func(){
        auto lambda = [](){};
    
        decltype(lambda) other;
    }
    

    Hatayı düzeltmek için varsayılan oluşturucunun çağrılma gereksinimini kaldırın. Lambda hiçbir şey yakalamıyorsa işlev işaretçisine dönüştürülebilir.

  • Silinen atama işlecine sahip lambdalar

    Aşağıdaki kod artık C2280 hatasını üretir:

    #include <memory>
    #include <type_traits>
    
    template <typename T, typename D>
    std::unique_ptr<T, typename std::remove_reference<D &&>::type> wrap_unique(T *p, D &&d);
    
    void f(int i)
    {
        auto encodedMsg = wrap_unique<unsigned char>(nullptr, [i](unsigned char *p) {
        });
        encodedMsg = std::move(encodedMsg);
    }
    

    Hatayı düzeltmek için lambda değerini bir functor sınıfıyla değiştirin veya atama işlecini kullanma gereksinimini kaldırın.

  • Silinen kopya oluşturucu ile bir nesneyi taşıma girişimi

    Şu kod artık C2280 hatasını üretir: 'moveable::moveable(const moveable &)': silinen bir işleve başvurmaya çalışıyor

    struct moveable {
    
        moveable() = default;
        moveable(moveable&&) = default;
        moveable(const moveable&) = delete;
    };
    
    struct S {
        S(moveable && m) :
            m_m(m)//copy constructor deleted
        {}
        moveable m_m;
    };
    

    Hatayı düzeltmek için şunu kullanın std::move :

    S(moveable && m) :
        m_m(std::move(m))
    
  • Yerel sınıf aynı işlevde daha sonra tanımlanan diğer yerel sınıfa başvuramaz

    Şu kod artık C2079 hatasını üretir: 's', tanımsız 'main::S2' yapısı kullanıyor

    int main()
    {
        struct S2;
        struct S1 {
            void f() {
                S2 s;
            }
        };
        struct S2 {};
    }
    

    Hatayı düzeltmek için tanımını S2yukarı taşıyın:

    int main()
    {
        struct S2 { //moved up
        };
    
    struct S1 {
        void f() {
            S2 s;
            }
        };
    }
    
  • Türetilmiş ctor gövdesinde korumalı bir temel ctor çağrılamaz.

    Şu kod artık C2248 hatası üretir: 'S1::S1': 'S1' sınıfında bildirilen korumalı üyeye erişilemiyor

    struct S1 {
    protected:
        S1();
    };
    
    struct S2 : public S1 {
        S2() {
            S1();
        }
    };
    

    Hatayı düzeltmek için, S2 içinde oluşturucudan S1() çağrısını kaldırın ve gerekirse başka bir fonksiyona yerleştirin.

  • {} işaretçiye dönüştürmeyi engeller

    Aşağıdaki kod artık C2439 'S::p' üretir: üye başlatılamadı

    struct S {
        S() : p({ 0 }) {}
        void *p;
    };
    

    Hatayı düzeltmek için "0" etrafındaki küme ayraçlarını kaldırın veya bunun yerine "nullptr" kullanın, bu örnekte gösterildiği gibi:

    struct S {
        S() : p(nullptr) {}
        void *p;
    };
    
  • Yanlış makro tanımı ve parantezli kullanım

    Şu anda aşağıdaki örnek, makro tanımında beklenmeyen bir ';' C2008 hatası üretiyor.

    #define A; //cause of error
    
    struct S {
        A(); // error
    };
    

    Sorunu çözmek için üst satırı "#define A();" olarak değiştirin.

    Aşağıdaki kod C2059 hatası üretir: söz dizimi hatası: ')'

    //notice the space after 'A'
    #define A () ;
    
    struct S {
        A();
    };
    

    Kodu düzeltmek için A ile () arasındaki boşluğu kaldırın.

    Aşağıdaki kod C2091 hatasını üretir: fonksiyon, bir fonksiyon döndürüyor.

    #define DECLARE void f()
    
    struct S {
        DECLARE();
    };
    

    Hatayı düzeltmek için, S: içinde DECLARE'tan sonra parantezleri kaldırın. DECLARE;

    Aşağıdaki kod C2062 hatasını oluşturur: tür 'int' beklenmedik.

    #define A (int)
    
    struct S {
        A a;
    };
    

    Sorunu çözmek için şu şekilde tanımlayın A :

    #define A int
    
  • Bildirimlerde fazladan parantez

    Aşağıdaki kod C2062 hatasını oluşturur: 'int' türü beklenmeyen

    struct S {
        int i;
        (int)j;
    };
    

    Hatayı düzeltmek için çevresindeki jparantezleri kaldırın. Netlik için parantez gerekiyorsa, kullanın typedef.

  • Derleyici tarafından oluşturulan oluşturucular ve __declspec(novtable)

    Visual Studio 2015'te, sanal taban sınıflara sahip soyut sınıfların derleyici tarafından oluşturulan satır içi oluşturucuları __declspec(novtable) ile birlikte kullanıldığında yanlış kullanımını __declspec(dllimport) ortaya çıkarma olasılığını artırır.

  • otomatik, doğrudan liste başlatmada tek bir ifade gerektirir

    Şu kod artık C3518 hatası üretir: 'testPositions': Doğrudan liste başlatma bağlamında 'auto' türü yalnızca tek bir başlatıcı ifadesinden çıkarılabilir

    auto testPositions{
        std::tuple<int, int>{13, 33},
        std::tuple<int, int>{-23, -48},
        std::tuple<int, int>{38, -12},
        std::tuple<int, int>{-21, 17}
    };
    

    Hatayı düzeltmek için aşağıdaki gibi başlatma testPositions olasılığı vardır:

    std::tuple<int, int> testPositions[]{
        std::tuple<int, int>{13, 33},
        std::tuple<int, int>{-23, -48},
        std::tuple<int, int>{38, -12},
        std::tuple<int, int>{-21, 17}
    };
    
  • is_convertible için türler ve tür işaretçilerini kontrol etme

    Aşağıdaki kod artık statik onaylama işleminin başarısız olmasına neden olur.

    struct B1 {
    private:
        B1(const B1 &);
    };
    struct B2 : public B1 {};
    struct D : public B2 {};
    
    static_assert(std::is_convertible<D, B2>::value, "fail");
    

    Hatayı düzeltmek için static_assert öğesini, D ve B2 işaretçileriyle karşılaştıracak şekilde değiştirin:

    static_assert(std::is_convertible<D*, B2*>::value, "fail");
    
  • __declspec(novtable) bildirimleri tutarlı olmalıdır

    __declspec bildirimlerinin tüm kitaplıklarda tutarlı olması gerekir. Aşağıdaki kod artık tek tanımlı bir kural (ODR) ihlali oluşturur:

    //a.cpp
    class __declspec(dllexport)
        A {
    public:
        A();
        A(const A&);
        virtual ~A();
    private:
        int i;
    };
    
    A::A() {}
    A::~A() {}
    A::A(const A&) {}
    
    //b.cpp
    // compile with cl.exe /nologo /LD /EHsc /Osx b.cpp
    #pragma comment(lib, "A")
    class __declspec(dllimport) A
    {
    public: A();
            A(const A&);
            virtual ~A();
    private:
        int i;
    };
    
    struct __declspec(novtable) __declspec(dllexport) B
        : virtual public A {
        virtual void f() = 0;
    };
    
    //c.cpp
    #pragma comment(lib, "A")
    #pragma comment(lib, "B")
    class __declspec(dllimport) A
    {
    public:
        A();
        A(const A&);
        virtual ~A();
    private:
        int i;
    };
    struct  /* __declspec(novtable) */ __declspec(dllimport) B // Error. B needs to be novtable here also.
        : virtual public A
    {
        virtual void f() = 0;
    };
    
    struct C : virtual B
    {
        virtual void f();
    };
    
    void C::f() {}
    C c;
    

Güncelleştirme 1'de Uyumluluk Geliştirmeleri

  • Özel sanal temel sınıflar ve dolaylı devralma

    Derleyicinin önceki sürümleri, türetilmiş bir sınıfın dolaylı olarak türetilmiş private virtual temel sınıflarının üye işlevlerini çağırmasına izin verdi. Bu eski davranış yanlıştı ve C++ standardına uymuyor. Derleyici artık bu şekilde yazılmış kodu kabul etmemektedir ve sonuç olarak derleyici hatası C2280'i döndürür.

    error C2280: 'void *S3::__delDtor(unsigned int)': attempting to reference a deleted function
    

    Örnek (önce)

    class base
    {
    protected:
        base();
        ~base();
    };
    
    class middle : private virtual base {}; class top : public virtual middle {};
    
    void destroy(top *p)
    {
        delete p;  //
    }
    

    Örnek (sonra)

    class base;  // as above
    
    class middle : protected virtual base {};
    class top : public virtual middle {};
    
    void destroy(top *p)
    {
        delete p;
    }
    

    - veya -

    class base;  // as above
    
    class middle : private virtual base {};
    class top : public virtual middle, private virtual bottom {};
    
    void destroy(top *p)
    {
        delete p;
    }
    
  • Aşırı yüklenmiş yeni işleç ve işleç silme

    Derleyicinin önceki sürümleri, üye olmayan işleç yeni ve üye olmayan işleç silme işleminin statik olarak bildirilmesine ve genel ad alanı dışındaki ad alanlarına bildirilmesine izin verdi. Bu eski davranış, programın programcının new amaçladığı veya delete işleci uygulamasını çağırmaması riski oluşturarak sessiz hatalı çalışma zamanı davranışına neden oldu. Derleyici artık bu şekilde yazılmış kodu kabul etmemektedir ve bunun yerine derleyici hatası C2323'e neden olur.

    error C2323: 'operator new': non-member operator new or delete functions may not be declared static or in a namespace other than the global namespace.
    

    Örnek (önce)

    static inline void * __cdecl operator new(size_t cb, const std::nothrow_t&)  // error C2323
    

    Örnek (sonra)

    void * __cdecl operator new(size_t cb, const std::nothrow_t&)  // removed 'static inline'
    

    Ayrıca, derleyici belirli bir tanılama vermese de, satır içi işleç new kötü biçimlendirilmiş olarak kabul edilir.

  • Sınıf dışı türlerde 'operator type()' (kullanıcı tanımlı dönüştürme) çağrısı

    Derleyicinin önceki sürümleri, sınıf dışı türlerde 'işleç türü()' çağrılmasına izin verirken bunu sessizce yoksayardı. Bu eski davranış sessiz hatalı kod oluşturma riski oluşturarak öngörülemeyen çalışma zamanı davranışına neden oldu. Derleyici artık bu şekilde yazılmış kodu kabul etmemektedir ve bunun yerine derleyici hatası C2228'i döndürür.

    error C2228: left of '.operator type' must have class/struct/union
    

    Örnek (önce)

    typedef int index_t;
    void bounds_check(index_t index);
    void login(int column)
    {
        bounds_check(column.operator index_t());  // error C2228
    }
    

    Örnek (sonra)

    typedef int index_t;
    void bounds_check(index_t index);
    void login(int column)
    {
        bounds_check(column);  // removed cast to 'index_t', 'index_t' is an alias of 'int'
    }
    
  • Ayrıntılı tür tanımlayıcılarında yedekli tür adı

    Derleyicinin önceki sürümleri, ayrıntılı bir tür belirticisinde typename kullanımına izin veriyordu, ancak bu şekilde yazılmış kodlar anlamsal olarak yanlıştır. Derleyici artık bu şekilde yazılmış kodu kabul etmemektedir ve bunun yerine derleyici hatası C3406'dır.

    error C3406: 'typename' cannot be used in an elaborated type specifier
    

    Örnek (önce)

    template <typename class T>
    class container;
    

    Örnek (sonra)

    template <class T>  // alternatively, could be 'template <typename T>'; 'typename' is not elaborating a type specifier in this case
    class container;
    
  • Başlatıcı listesinden dizilerin tür çıkarımı

    Derleyicinin önceki sürümleri, bir başlatıcı listesinden dizilerin tür kesintisini desteklemedi. Derleyici artık bu tür çıkarım biçimini destekler ve sonuç olarak, başlatıcı listeleri kullanan işlev şablonlarına yapılan çağrılar artık belirsiz olabilir veya derleyicinin önceki sürümlerinden farklı bir aşırı yükleme seçilebilir. Bu sorunları çözmek için, programın artık programcının hedeflediği aşırı yüklemeyi açıkça belirtmesi gerekir.

    Bu yeni davranış, aşırı yükleme çözümlemesinin, önceki aday kadar iyi olan başka bir adayı dikkate almasına neden olduğunda, çağrı belirsiz hale gelir ve sonuç olarak derleyici C2668 derleyici hatasını verir.

    error C2668: 'function' : ambiguous call to overloaded function.
    

    Örnek 1: Aşırı yüklenmiş fonksiyona belirsiz çağrı (önce)

    // In previous versions of the compiler, code written in this way would unambiguously call f(int, Args...)
    template < typename... Args>
    void f(int, Args...);  //
    
    template < int N, typename... Args>
    void f(const int(&)[N], Args...);
    
    int main()
    {
        // The compiler now considers this call ambiguous, and issues a compiler error
         f({ 3 });   error C2668 : 'f' ambiguous call to overloaded function
    }
    

    Örnek 1: Aşırı yüklenmiş fonksiyona belirsiz çağrı (sonra)

    template < typename... Args>
    void f(int, Args...);  //
    
    template < int N, typename... Args>
    void f(const int(&)[N], Args...);
    
    int main()
    {
        // To call f(int, Args...) when there is just one expression in the initializer list, remove the braces from it.
        f(3);
    }
    

    Bu yeni davranış, aşırı yükleme çözümlemesinin geçmiş adaydan daha iyi bir aday olarak kabul edilmesine neden olduğunda, çağrı yeni adayla belirsiz bir şekilde çözülür ve programcının hedeflediği davranıştan büyük olasılıkla farklı bir program davranışı değişikliğine neden olur.

    Örnek 2: aşırı yükleme çözünürlüğünde değişiklik (önce)

    // In previous versions of the compiler, code written in this way would unambiguously call f(S, Args...)
    struct S
    {
        int i;
        int j;
    };
    
    template < typename... Args>
    void f(S, Args...);
    
    template < int N, typename... Args>
    void f(const int *&)[N], Args...);
    
    int main()
    {
        // The compiler now resolves this call to f(const int (&)[N], Args...) instead
         f({ 1, 2 });
    }
    

    Örnek 2: aşırı yük bindirme çözümlemesinde değişiklik (sonrasında)

    struct S;  // as before
    
    template < typename... Args>
    void f(S, Args...);
    
    template < int N, typename... Args>
    void f(const int *&)[N], Args...);
    
    int main()
    {
        // To call f(S, Args...), perform an explicit cast to S on the initializer list.
        f(S{ 1, 2 });
    }
    
  • Switch deyimi uyarılarının düzeltilmesi

    Derleyicinin önceki bir sürümü ifadelerle ilgili switch bazı uyarıları kaldırdı; bu uyarılar şimdi geri yüklendi. Derleyici artık geri yüklenen uyarıları yayımlar ve belirli durumlarla (varsayılan durum dahil) ilgili uyarılar, switch deyiminin son satırında değil, sorunlu durumu içeren satırda verilir. Bu uyarıların geçmiştekinden farklı satırlarda verilmesinin bir sonucu olarak, daha önce kullanılarak #pragma warning(disable:####) gizlenen uyarılar artık istendiği gibi gizlenmeyebilir. Bu uyarıların beklendiği gibi bastırılabilmesi için #pragma warning(disable:####) yönergesini ilk sorunlu durumun üzerindeki bir satıra taşımak gerekebilir. Geri yüklenen uyarılar şunlardır:

    warning C4060: switch statement contains no 'case' or 'default' labels
    
    warning C4061: enumerator 'bit1' in switch of enum 'flags' is not explicitly handled by a case label
    
    warning C4062: enumerator 'bit1' in switch of enum 'flags' is not handled
    
    warning C4063: case 'bit32' is not a valid value for switch of enum 'flags'
    
    warning C4064: switch of incomplete enum 'flags'
    
    warning C4065: switch statement contains 'default' but no 'case' labels
    
    warning C4808: case 'value' is not a valid value for switch condition of type 'bool'
    
    Warning C4809: switch statement has redundant 'default' label; all possible 'case' labels are given
    

    C4063 örneği (önce)

    class settings
    {
    public:
        enum flags
        {
            bit0 = 0x1,
            bit1 = 0x2,
            ...
        };
        ...
    };
    
    int main()
    {
        auto val = settings::bit1;
    
        switch (val)
        {
        case settings::bit0:
            break;
    
        case settings::bit1:
            break;
    
             case settings::bit0 | settings::bit1:  // warning C4063
                break;
        }
    }
    

    C4063 örneği (sonra)

    class settings { ... };  // as above
    int main()
    {
        // since C++11, use std::underlying_type to determine the underlying type of an enum
        typedef std::underlying_type< settings::flags> ::type flags_t;
    
            auto val = settings::bit1;
    
        switch (static_cast< flags_t> (val))
        {
        case settings::bit0:
            break;
    
        case settings::bit1:
            break;
    
        case settings::bit0 | settings::bit1:  // ok
            break;
        }
    };
    

    Geri yüklenen diğer uyarıların örnekleri belgelerinde verilmiştir.

  • #include: '..' üst dizin tanımlayıcısının kullanımı pathname içinde (yalnızca /Wall/WX etkiler)

    Derleyicinin önceki sürümleri üst dizin tanımlayıcısı '..' kullanımını algılamadı #include yönergelerinin dosya yolu içinde. Bu şekilde yazılan kod genellikle proje göreli yollarını yanlış kullanarak projenin dışında bulunan üst bilgileri içerecek şekilde tasarlanmıştır. Bu eski davranış, programın programcı tarafından amaçlanandan farklı bir kaynak dosya eklenerek derlenebilmesi veya bu göreli yolların diğer derleme ortamlarına taşınabilir olmayacağı riskini doğurdu. Derleyici şimdi programcıya bu şekilde yazılmış kodu algılar ve bildirir ve etkinleştirildiyse isteğe bağlı bir derleyici uyarısı C4464 verir.

    warning C4464: relative include path contains '..'
    

    Örnek (önce)

    #include "..\headers\C4426.h"  // emits warning C4464
    

    Örnek (sonra)

    #include "C4426.h"  // add absolute path to 'headers\' to your project's include directories
    

    Ayrıca, derleyici belirli bir tanılama vermese de, projenizin ekleme dizinlerini belirtmek için üst dizin tanımlayıcısının ".." kullanılmaması önerilir.

  • #pragma optimize() üst bilgi dosyasının sonunu aşacak şekilde genişletir (yalnızca etkiler /Wall/WX)

    Derleyicinin önceki sürümleri, çeviri birimine dahil edilen üst bilgi dosyasından kaçan iyileştirme bayrağı ayarlarında yapılan değişiklikleri algılamadı. Derleyici şimdi programcıya bu şekilde yazılmış kodu algılar ve bildirir ve etkinleştirildiyse sorunlu #includekonumunda isteğe bağlı bir derleyici uyarısı C4426 verir. Bu uyarı yalnızca değişiklikler, derleyiciye komut satırı argümanı tarafından ayarlanan iyileştirme bayraklarıyla çakışıyorsa çıkarılır.

    warning C4426: optimization flags changed after including header, may be due to #pragma optimize()
    

    Örnek (önce)

    // C4426.h
    #pragma optimize("g", off)
    ...
    // C4426.h ends
    
    // C4426.cpp
    #include "C4426.h"  // warning C4426
    

    Örnek (sonra)

    // C4426.h
    #pragma optimize("g", off)
                ...
    #pragma optimize("", on)  // restores optimization flags set via command-line arguments
    // C4426.h ends
    
    // C4426.cpp
    #include "C4426.h"
    
  • Eşleşmeyen #pragma warning(push) ve #pragma warning(pop) (yalnızca /Wall/WX etkiler)

    Derleyicinin önceki sürümleri, durum değişikliklerinin nadiren amaçlanan farklı bir kaynak dosyasındaki durum değişiklikleriyle #pragma warning(push) eşleştirildiğini algılamadı#pragma warning(pop). Bu eski davranış, programın programcının amaçladığı uyarı kümesinden farklı bir uyarı kümesiyle derlenmesi ve büyük olasılıkla sessiz hatalı çalışma zamanı davranışına neden olma riski doğurdu. Derleyici artık bu şekilde yazılmış kodu algılar ve programcıya bildirir. Etkinse, eşleşen #pragma warning(pop) konumunda isteğe bağlı olarak derleyici uyarısı C5031’i verir. Bu uyarı, ilgili #pragma warning(push) konumuna atıfta bulunan bir not içerir.

    warning C5031: #pragma warning(pop): likely mismatch, popping warning state pushed in different file
    

    Örnek (önce)

    // C5031_part1.h
    #pragma warning(push)
    #pragma warning(disable:####)
    ...
    // C5031_part1.h ends without #pragma warning(pop)
    
    // C5031_part2.h
    ...
    #pragma warning(pop)  // pops a warning state not pushed in this source file
    ...
    // C5031_part1.h ends
    
    // C5031.cpp
    #include "C5031_part1.h" // leaves #pragma warning(push) 'dangling'
    ...
    #include "C5031_part2.h" // matches 'dangling' #pragma warning(push), resulting in warning C5031
    ...
    

    Örnek (sonra)

    // C5031_part1.h
    #pragma warning(push)
    #pragma warning(disable:####)
    ...
    #pragma warning(pop)  // pops the warning state pushed in this source file
    // C5031_part1.h ends without #pragma warning(pop)
    
    // C5031_part2.h
    #pragma warning(push)  // pushes the warning state pushed in this source file
    #pragma warning(disable:####)
    ...
    #pragma warning(pop)
    // C5031_part1.h ends
    
    // C5031.cpp
    #include "C5031_part1.h" // #pragma warning state changes are self-contained and independent of other source files or their #include order.
    ...
    #include "C5031_part2.h"
    ...
    

    Yaygın olmasa da, bu şekilde yazılan kodlar bazen kasıtlı olarak gerçekleştirilir. Bu şekilde yazılan kod, değişikliklere #include sırasıyla duyarlıdır; mümkün olduğunda, kaynak kod dosyalarının uyarı durumunu kendi içinde bir şekilde yönetmesini öneririz.

  • Eşleşmeyen #pragma uyarı(push) (yalnızca /Wall/WX etkiler)

    Derleyicinin önceki sürümleri, çeviri biriminin sonunda eşleşmeyen #pragma warning(push) durum değişikliklerini algılamadı. Derleyici şimdi programcıya bu şekilde yazılmış kodu algılar ve bildirir ve etkinleştirilirse eşleşmeyen #pragma warning(push)konumunda isteğe bağlı bir derleyici uyarısı C5032 verir. Bu uyarı yalnızca çeviri biriminde derleme hatası yoksa verilir.

    warning C5032: detected #pragma warning(push) with no corresponding #pragma warning(pop)
    

    Örnek (önce)

    // C5032.h
    #pragma warning(push)
    #pragma warning(disable:####)
    ...
    // C5032.h ends without #pragma warning(pop)
    
    // C5032.cpp
    #include "C5032.h"
    ...
    // C5032.cpp ends -- the translation unit is completed without #pragma warning(pop), resulting in warning C5032 on line 1 of C5032.h
    

    Örnek (sonra)

    // C5032.h
    #pragma warning(push)
    #pragma warning(disable:####)
    ...
    #pragma warning(pop) // matches #pragma warning (push) on line 1
    // C5032.h ends
    
    // C5032.cpp
    #include "C5032.h"
    ...
    // C5032.cpp ends -- the translation unit is completed without unmatched #pragma warning(push)
    
  • Geliştirilmiş #pragma uyarı durumu izlemesi sonucunda ek uyarılar oluşturulabilir

    Derleyicinin önceki sürümleri, #pragma uyarı durumu değişikliklerini yeterince iyi izleyemediği için istenen tüm uyarıları veremedi. Bu davranış, programcının hedeflediğinden farklı durumlarda belirli uyarıların etkili bir şekilde gizleneceği bir risk oluşturmuştur. Derleyici artık #pragma warning durumunu daha sağlam bir şekilde izler - özellikle şablonlar içindeki #pragma warning durum değişiklikleriyle ilgili - ve isteğe bağlı olarak, programcının #pragma warning(push) ve #pragma warning(pop)'in istenmeyen kullanımlarını bulmasına yardımcı olmak için tasarlanan yeni C5031 ve C5032 uyarılarını verir.

    Gelişmiş #pragma warning durum değişikliği izlemesi sonucunda, önceden yanlış bir şekilde gizlenen uyarılar veya önceden yanlış tanılanan sorunlarla ilgili uyarılar artık yayınlanabilir.

  • Ulaşılamayan kodun iyileştirilmiş kimliği

    C++ Standart Kitaplığı değişiklikleri ve derleyicinin önceki sürümlerine göre işlev çağrılarını satır içi hale getirme yeteneği, derleyicinin belirli kodlara artık ulaşılamadığını kanıtlamasını mümkün kılabilir. Bu yeni davranış, C4720 uyarısının yeni ve daha sık verilen örneklerine neden olabilir.

    warning C4720: unreachable code
    

    Çoğu durumda, bu uyarı yalnızca iyileştirmeler etkin olarak derlenirken verilebilir, çünkü iyileştirmeler daha fazla işlev çağrısı satır içi yapabilir, yedekli kodu ortadan kaldırabilir veya başka bir şekilde belirli kodun erişilemez olduğunu belirlemeyi mümkün hale getirir. C4720 uyarılarının yeni örneklerinin, özellikle std::find kullanımıyla ilgili olarak try/catch bloklarında sıklıkla oluştuğuna dikkat ettik.

    Örnek (önce)

    try
    {
        auto iter = std::find(v.begin(), v.end(), 5);
    }
    catch (...)
    {
        do_something();   // ok
    }
    

    Örnek (sonra)

    try
    {
        auto iter = std::find(v.begin(), v.end(), 5);
    }
    catch (...)
    {
        do_something();   // warning C4702: unreachable code
    }
    

Güncelleştirme 2'de Uyumluluk Geliştirmeleri

  • SFINAE ifadesi için kısmi destek sonucunda ek uyarılar ve hatalar oluşabilir

    Derleyicinin önceki sürümleri, SFINAE ifadesi için destek olmaması nedeniyle tanımlayıcıların içinde decltype belirli ifade türlerini ayrıştırmamıştı. Bu eski davranış yanlıştı ve C++ standardına uymuyor. Derleyici artık bu ifadeleri ayrıştırıyor ve devam eden uyumluluk geliştirmeleri nedeniyle SFINAE ifadesi için kısmi desteğe sahip. Sonuç olarak, derleyici artık önceki sürümlerinin ayrıştıramadığı ifadelerde bulunan uyarı ve hataları oluşturur.

    Bu yeni davranış henüz bildirilmemiş bir tür içeren bir decltype ifadeyi ayrıştırdığında, derleyici sonuç olarak derleyici hatası C2039'ı döndürür.

    error C2039: 'type': is not a member of 'global namespace'
    

    Örnek 1: bildirilmemiş bir türün kullanımı (önce)

    struct s1
    {
        template < typename T>
        auto f() - > decltype(s2< T> ::type::f());  // error C2039
    
        template< typename>
        struct s2 {};
    }
    

    Örnek 1 (sonra)

    struct s1
    {
        template < typename>  // forward declare s2struct s2;
    
            template < typename T>
        auto f() - > decltype(s2< T> ::type::f());
    
        template< typename>
        struct s2 {};
    }
    

    Bu yeni davranış, bağımlı bir decltype ismin bir tür olduğunu belirtmek için gerekli olan typename anahtar sözcüğünü kullanmadan bir ifadeyi ayrıştırdığında, derleyici C2923 derleyici hatasıyla birlikte C4346 derleyici uyarısını verir.

    warning C4346: 'S2<T>::Type': dependent name is not a type
    
    error C2923: 's1': 'S2<T>::Type' is not a valid template type argument for parameter 'T'
    

    Örnek 2: bağımlı ad bir tür değil (önce)

    template < typename T>
    struct s1
    {
        typedef T type;
    };
    
    template < typename T>
    struct s2
    {
        typedef T type;
    };
    
    template < typename T>
    T declval();
    
    struct s
    {
        template < typename T>
        auto f(T t) - > decltype(t(declval< S1< S2< T> ::type> ::type> ()));  // warning C4346, error C2923
    };
    

    Örnek 2 (sonra)

    template < typename T> struct s1 { ... };  // as above
    template < typename T> struct s2 { ... };  // as above
    
    template < typename T>
    T declval();
    
    struct s
    {
        template < typename T>
        auto f(T t) - > decltype(t(declval< S1< typename S2< T> ::type> ::type> ()));
    };
    
  • volatile üye değişkenleri örtük olarak tanımlanmış oluşturucuları ve atama işleçlerini engeller

    Derleyicinin önceki sürümleri, üye değişkenleri olan volatile bir sınıfın varsayılan kopyalama/taşıma oluşturucularına ve varsayılan kopyalama/taşıma atama işleçlerinin otomatik olarak oluşturulmasına izin verdi. Bu eski davranış yanlıştı ve C++ standardına uymuyor. Derleyici artık üye değişkenleri olan volatile bir sınıfı önemsiz olmayan yapı ve atama işleçlerine sahip olarak değerlendirir ve bu da bu işleçlerin varsayılan uygulamalarının otomatik olarak oluşturulmasını engeller. Böyle bir sınıf bir birleşimin (veya bir sınıfın içindeki anonim bir birleşimin) üyesi olduğunda, birleşimin (veya anonim birleşimi içeren sınıfın) kopyalama/taşıma oluşturucuları ve kopyalama/taşıma atama işleçleri örtük olarak silinmiş olarak tanımlanır. Açıkça tanımlanmadan birleşim (veya anonim birleşimi içeren sınıf) oluşturma veya kopyalama girişimi bir hatadır ve derleyici sonuç olarak derleyici hatası C2280'i oluşturur.

    error C2280: 'B::B(const B &)': attempting to reference a deleted function
    

    Örnek (önce)

    struct A
    {
        volatile int i;
        volatile int j;
    };
    
    extern A* pa;
    
    struct B
    {
        union
        {
            A a;
            int i;
        };
    };
    
    B b1{ *pa };
    B b2(b1);  // error C2280
    

    Örnek (sonra)

    struct A
    {
        int i; int j;
    };
    
    extern volatile A* pa;
    
    A getA()  // returns an A instance copied from contents of pa
    {
        A a;
        a.i = pa - > i;
        a.j = pa - > j;
        return a;
    }
    
    struct B;  // as above
    
    B b1{ GetA() };
    B b2(b1);  // error C2280
    
  • Statik üye işlevleri cv niteleyicilerini desteklemez.

    Visual Studio 2015'in önceki sürümleri, statik üye işlevlerinin cv niteleyicilerine sahip olmasını sağladı. Bu davranış, Visual Studio 2015 ve Visual Studio 2015 Güncelleştirme 1'deki bir regresyondan kaynaklanır; Visual Studio 2013 ve derleyicinin önceki sürümleri bu şekilde yazılmış kodu reddeder. Visual Studio 2015 ve Visual Studio 2015 Güncelleştirme 1'in davranışı yanlıştır ve C++ standardına uygun değildir. Visual Studio 2015 Güncelleştirme 2 bu şekilde yazılmış kodu reddeder ve bunun yerine derleyici hatası C2511'i döndürür.

    error C2511: 'void A::func(void) const': overloaded member function not found in 'A'
    

    Örnek (önce)

    struct A
    {
        static void func();
    };
    
    void A::func() const {}  // C2511
    

    Örnek(sonra)

    struct A
    {
        static void func();
    };
    
    void A::func() {}  // removed const
    
  • WinRT kodunda enum'un ileri bildirimi izin verilmez (yalnızca etkiler /ZW)

    Windows Çalışma Zamanı (WinRT) için derlenen kod, enum türlerinin ileriye dönük olarak bildirilmelerine izin vermez, tıpkı /clr derleyici anahtarı seçeneği kullanılarak .Net Framework için yönetilen C++ kodu derlendiğinde olduğu gibi. Bu davranış, bir sabit listesi boyutunun her zaman bilinmesini ve WinRT tür sistemine doğru şekilde yansıtılabilmesini sağlar. Derleyici bu şekilde yazılmış kodu reddeder ve derleyici hatası C3197 ile birlikte C2599 derleyici hatası döndürür.

    error C2599: 'CustomEnum': the forward declaration of a WinRT enum is not allowed
    
    error C3197: 'public': can only be used in definitions
    

    Örnek (önce)

    namespace A {
        public enum class CustomEnum : int32;  // forward declaration; error C2599, error C3197
    }
    
    namespace A {
        public enum class CustomEnum : int32
        {
            Value1
        };
    }
    
    public ref class Component sealed
    {
    public:
        CustomEnum f()
        {
            return CustomEnum::Value1;
        }
    };
    

    Örnek (sonra)

              // forward declaration of CustomEnum removed
    namespace A {
        public enum class CustomEnum : int32
        {
            Value1
        };
    }
    
    public ref class Component sealed
    {
    public:
        CustomEnum f()
        {
            return CustomEnum::Value1;
        }
    };
    
  • Aşırı yüklenmiş üye olmayan işleç yeni ve işleç silme satır içinde bildirilemez (Düzey 1 (/W1) varsayılan olarak)

    Üye olmayan işleç yeni ve işleç silme işlevleri satır içinde bildirildiğinde derleyicinin önceki sürümleri uyarı vermez. Bu şekilde yazılan kod hatalı biçimlendirilmiş (tanılama gerekmez) ve uyumsuz new ve delete işleçlerinden kaynaklanan bellek sorunlarına neden olabilir (özellikle boyut belirten serbest bırakma ile birlikte kullanıldığında) ve tanılaması zor olabilir. Derleyici artık bu şekilde yazılmış kodu tanımlamaya yardımcı olmak için derleyici uyarısı C4595'i oluşturur.

    warning C4595: 'operator new': non-member operator new or delete functions may not be declared inline
    

    Örnek (önce)

    inline void* operator new(size_t sz)  // warning C4595
    {
        ...
    }
    

    Örnek (sonra)

    void* operator new(size_t sz)  // removed inline
    {
        ...
    }
    

    Bu şekilde yazılan kodun düzeltilmesi, işleç tanımlarının bir üst bilgi dosyasından ve ilgili kaynak dosyaya taşınmasını gerektirebilir.

Güncelleştirme 3'te Uyumluluk Geliştirmeleri

  • std::is_convertible artık kendi kendine atamaları algılıyor (standart kütüphane)

    std::is_convertable type-trait'in önceki sürümleri, kopya oluşturucu silindiğinde veya özel erişime sahip olduğunda sınıf türünün kendi kendine atanmasını doğru şekilde algılayamıyordu. Şimdi, std::is_convertable<>::value, silinmiş veya özel kopya yapıcıya sahip bir sınıf türüne uygulandığında, false olarak doğru bir şekilde ayarlanır.

    Bu değişiklikle ilişkilendirilmiş derleyici tanılaması yok.

    Örnek

    #include <type_traits>
    
    class X1
    {
                public:
                X1(const X1&) = delete;
                };
    
    class X2
    {
                private:
                X2(const X2&);
                };
    
    static_assert(std::is_convertible<X1&, X1>::value, "BOOM");static_assert(std::is_convertible<X2&, X2>::value, "BOOM");
    

    Derleyicinin önceki sürümlerinde, bu örneğin en altındaki statik onaylar, std::is_convertable<>::value hatalı olarak true şeklinde ayarlandığı için geçer. Şimdi, std::is_convertable<>::value doğru bir şekilde false olarak ayarlanmış, bu da statik onayların başarısız olmasına neden olmuştur.

  • Varsayılan veya silinmiş önemsiz kopyalama ve taşıma oluşturucuları erişim tanımlayıcılarını dikkate alır

    Derleyicinin önceki sürümleri, varsayılan veya silinmiş önemsiz kopya ve taşıma yapıcılarının çağrılmasına izin vermeden önce erişim belirleyicisini kontrol etmedi. Bu eski davranış yanlıştı ve C++ standardına uymuyor. Bazı durumlarda, bu eski davranış sessiz hatalı kod oluşturma riski oluşturarak öngörülemeyen çalışma zamanı davranışına neden oldu. Derleyici artık varsayılan veya silinmiş önemsiz kopya ve taşıma kurucularının erişim tanımlayıcısını denetler ve çağrılıp çağrılamayacağını belirler; eğer çağrılmazsa, sonuç olarak derleyici uyarısı C2248'i verir.

    error C2248: 'S::S' cannot access private member declared in class 'S'
    

    Örnek (önce)

    class S {
    public:
        S() = default;
    private:
        S(const S&) = default;
    };
    
    void f(S);  // pass S by value
    
    int main()
    {
        S s;
        f(s);  // error C2248, can't invoke private copy constructor
    }
    

    Örnek (sonra)

    class S {
    public:
        S() = default;
    private:
        S(const S&) = default;
    };
    
    void f(const S&);  // pass S by reference
    
    int main()
    {
        S s;
        f(s);
    }
    
  • Öznitelikli ATL kod desteğinin kullanımdan kaldırılması (Düzey 1 (/W1) varsayılan olarak)

    Derleyicinin önceki sürümleri öznitelikli ATL kodunu destekliyor. Visual Studio 2008'de başlayan öznitelikli ATL kodu desteğini kaldırmanın sonraki aşaması olarak, atfedilen ATL kodu kullanım dışı bırakılmıştır. Derleyici artık bu tür kullanım dışı kodu tanımlamaya yardımcı olmak için derleyici uyarısı C4467'yi çıkartır.

    warning C4467: Usage of ATL attributes is deprecated
    

    Derleyiciden destek kaldırılana kadar öznitelikli ATL kodunu kullanmaya devam etmek istiyorsanız, derleyiciye /Wv:18 veya /wd:4467 komut satırı argümanlarını geçirerek ya da kaynak kodunuza #pragma warning(disable:4467) ekleyerek bu uyarı mesajını devre dışı bırakabilirsiniz.

    Örnek 1 (önce)

              [uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")]
    class A {};
    

    Örnek 1 (sonra)

    __declspec(uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")) A {};
    

    Bazen aşağıdaki örnek kodda olduğu gibi kullanım dışı ATL özniteliklerini kullanmaktan kaçınmak için bir IDL dosyası oluşturmanız gerekebilir veya bu dosyayı oluşturmak isteyebilirsiniz

    Örnek 2 (önce)

    [emitidl];
    [module(name = "Foo")];
    
    [object, local, uuid("9e66a290-4365-11d2-a997-00c04fa37ddb")]
    __interface ICustom {
        HRESULT Custom([in] long l, [out, retval] long *pLong);
        [local] HRESULT CustomLocal([in] long l, [out, retval] long *pLong);
    };
    
    [coclass, appobject, uuid("9e66a294-4365-11d2-a997-00c04fa37ddb")]
    class CFoo : public ICustom
    {
        // ...
    };
    

    İlk olarak *.idl dosyasını oluşturun; vc140.idl tarafından oluşturulan dosya, arabirimleri ve ek açıklamaları içeren bir *.idl dosyası almak için kullanılabilir.

    Ardından, C++ arabirim tanımlarının oluşturulduğundan emin olmak için derlemenize bir MIDL adımı ekleyin.

    Örnek 2 IDL (sonra)

    import "docobj.idl";
    
    [
        object, local, uuid(9e66a290 - 4365 - 11d2 - a997 - 00c04fa37ddb)
    ]
    
    interface ICustom : IUnknown {
        HRESULT  Custom([in] long l, [out, retval] long *pLong);
        [local] HRESULT  CustomLocal([in] long l, [out, retval] long *pLong);
    };
    
    [version(1.0), uuid(29079a2c - 5f3f - 3325 - 99a1 - 3ec9c40988bb)]
    library Foo
    {
        importlib("stdole2.tlb");
    importlib("olepro32.dll");
    [
        version(1.0),
        appobject,uuid(9e66a294 - 4365 - 11d2 - a997 - 00c04fa37ddb)
    ]
    
    coclass CFoo {
        interface ICustom;
    };
    }
    

    Ardından, aşağıdaki örnek kodda olduğu gibi doğrudan uygulama dosyasında ATL kullanın.

    Örnek 2 Uygulama (sonra)

    #include <idl.header.h>
    #include <atlbase.h>
    
    class ATL_NO_VTABLE CFooImpl :
        public ICustom,
        public ATL::CComObjectRootEx< CComMultiThreadModel>
    {
    public:
        BEGIN_COM_MAP(CFooImpl)
            COM_INTERFACE_ENTRY(ICustom)
        END_COM_MAP()
    };
    
  • Önceden derlenmiş üst bilgi (PCH) dosyaları ve eşleşmeyen #include yönergeleri (yalnızca etkiler /Wall/WX)

    Derleyicinin önceki sürümleri, önceden derlenmiş üst bilgi (PCH) dosyaları kullanılırken, -Yc ve -Yu derlemeleri arasında kaynak dosyalarda uyumsuz #include yönergelerini kabul etti. Bu şekilde yazılan kod artık derleyici tarafından kabul edilmez. Derleyici artık PCH dosyalarını kullanırken eşleşmeyen #include yönergeleri tanımlamaya yardımcı olmak için CC4598 derleyici uyarısı verdi.

    warning C4598: 'b.h': included header file specified for Ycc.h at position 2 does not match Yuc.h at that position
    

    Örnek (önce):

    X.cpp (-Ycc.h)

    #include "a.h"
    #include "b.h"
    #include "c.h"
    

    Z.cpp (-Yuc.h)

    #include "b.h"
    #include "a.h"  // mismatched order relative to X.cpp
    #include "c.h"
    

    Örnek (sonra)

    X.cpp (-Ycc.h)

    #include "a.h"
    #include "b.h"
    #include "c.h"
    

    Z.cpp (-Yuc.h)

    #include "a.h"
    #include "b.h" // matched order relative to X.cpp
    #include "c.h"
    
  • Önceden derlenmiş üst bilgi (PCH) dosyaları ve eşleşmeyen include dizinleri (yalnızca etkiler /Wall/WX)

    Önceki derleyici sürümleri, önceden derlenmiş üst bilgi (PCH) dosyaları kullanılırken -Yc ve -Yu derlemeleri arasında derleyiciye eşleşmeyen include dizini komut satırı bağımsız değişkenlerini kabul ediyordu. Bu şekilde yazılan kod artık derleyici tarafından kabul edilmez. Derleyici artık PCH dosyalarını kullanırken eşleşmeyen include directory (-I) komut satırı bağımsız değişkenlerini tanımlamaya yardımcı olmak için derleyici uyarısı CC4599'u çalıştırıyor.

    warning C4599: '-I..' : specified for Ycc.h at position 1 does not match Yuc.h at that position
    

    Örnek (önce)

    cl /c /Wall /Ycc.h -I.. X.cpp
    cl /c /Wall /Yuc.h Z.cpp
    

    Örnek (sonra)

    cl /c /Wall /Ycc.h -I.. X.cpp
    cl /c /Wall /Yuc.h -I.. Z.cpp
    

Visual Studio 2013 Uyumluluk Değişiklikleri

Derleyici

  • Son anahtar sözcük, daha önce derleneceği yerde artık çözümlenmemiş simge hatası üretir:

    struct S1 {
        virtual void f() = 0;
    };
    
    struct S2 final : public S1 {
        virtual void f();
    };
    
    int main(S2 *p)
    {
        p->f();
    }
    

    Önceki sürümlerde, bir virtual çağrısı olduğundan hata oluşmadı; yine de program çalışırken çöküyordu. Artık, sınıfın son olduğu bilindiğinden bir bağlayıcı hatası verilmektedir. Bu örnekte, hatayı düzeltmek için tanımını S2::fiçeren obj ile bağlantı oluşturursunuz.

  • Ad alanları içinde arkadaş işlevlerini kullandığınızda, başvurmadan önce friend işlevini yeniden oluşturmanız gerekir, aksi takdirde derleyici artık ISO C++ Standardına uygun olduğundan bir hata alırsınız. Örneğin, bu örnek artık derlenmez:

    namespace NS {
        class C {
            void func(int);
            friend void func(C* const) {}
        };
    
        void C::func(int) {
            NS::func(this);  // error
        }
    }
    

    Bu kodu düzeltmek için işlevini bildirin friend :

    namespace NS {
        class C {
            void func(int);
            friend void func(C* const) {}
        };
    
        void func(C* const);  // conforming fix
    
        void C::func(int) {
            NS::func(this);
        }
    
  • C++ Standard, bir sınıfta açık özelleştirmeye izin vermez. Microsoft C++ derleyicisi bazı durumlarda buna izin veriyor olsa da, aşağıdaki örnek gibi durumlarda derleyici ikinci işlevi ilkinin uzmanlığı olarak değerlendirmediğinden bir hata oluşturulur.

    template < int N>
    class S {
    public:
        template  void f(T& val);
        template < > void f(char val);
    };
    
    template class S< 1>;
    

    Bu kodu düzeltmek için ikinci işlevi değiştirin:

    template <> void f(char& val);
    
  • Derleyici artık aşağıdaki örnekteki iki işlevi birbirinden ayırmaya çalışmıyor ve şimdi bir hata yayıyor:

    template< typename T> void Func(T* t = nullptr);
    template< typename T> void Func(...);
    
    int main() {
        Func< int>(); // error
    }
    

    Bu kodu düzeltmek için çağrıyı netleştirin:

    template< typename T> void Func(T* t = nullptr);
    template< typename T> void Func(...);
    
    int main() {
        Func< int>(nullptr); // ok
    }
    
  • Derleyici ISO C++11'e uymadan önce, aşağıdaki kod derlenir ve x türüne int çözülürdü.

    auto x = {0};
    int y = x;
    

    Bu kod artık x türünü std::initializer_list<int> olarak tanımlar ve x türüne int atamaya çalışan bir sonraki satırda bir hataya neden olur. Varsayılan olarak herhangi bir dönüşüm yoktur. Bu kodu düzeltmek için int ile auto öğesini değiştirin.

    int x = {0};
    int y = x;
    
  • Sağ taraftaki değerin türü başlatılmakta olan soldaki değerin türüyle eşleşmediğinde toplu başlatmaya artık izin verilmez ve ISO C++11 Standardı, dönüştürmeleri daraltmadan çalışmak için tekdüzen başlatma gerektirdiğinden bir hata verilir. Daha önce, bir daraltma dönüştürmesi varsa, hata yerine derleyici uyarısı (düzey 4) C4242 uyarısı verilmişti.

    int i = 0;
    char c = {i}; // error
    

    Bu kodu düzeltmek için açık bir daraltma dönüşümü ekleyin:

    int i = 0;
    char c = {static_cast<char>(i)};
    
  • Aşağıdaki başlatmaya artık izin verilmiyor:

    void *p = {{0}};
    

    Bu kodu düzeltmek için şu formlardan birini kullanın:

    void *p = 0;
    // or
    void *p = {0};
    
  • Ad araması değişti. Aşağıdaki kod, Visual Studio 2012 ve Visual Studio 2013'teki C++ derleyicisinde farklı şekilde çözümlenir:

    enum class E1 { a };
    enum class E2 { b };
    
    int main()
    {
        typedef E2 E1;
        E1::b;
    }
    

    Visual Studio 2012'de E1 ifadesi E1::b, genel kapsamda ::E1 olarak çözümlendi. Visual Studio 2013'te, E1 ifadesi, E1::b içinde typedef E2 tanımına çözümlenir ve main() üzerinde ::E2 türüne sahiptir.

  • Nesne düzeni değişti. x64 üzerinde, bir sınıfın nesne düzeni önceki sürümlere göre değişebilmektedir. İşlevi virtual varsa ancak virtual işlevine sahip bir temel sınıfı yoksa, derleyicinin nesne modeli veri üyesi yerleşiminden sonra virtual işlev tablosuna bir işaretçi ekler. Başka bir deyişle, ilgili düzen her durumda en uygun düzen olmayabilir. Önceki sürümlerde, x64 için bir iyileştirme sizin için düzeni geliştirmeye çalışacaktı, ancak karmaşık kod durumlarında düzgün çalışmadığından, Visual Studio 2013'te kaldırıldı. Örneğin, aşağıdaki kodu düşünün:

    __declspec(align(16)) struct S1 {
    };
    
    struct S2 {
        virtual ~S2();
        void *p;
        S1 s;
    };
    
  • Visual Studio 2013'te x64'ün sonucu sizeof(S2) 48'dir, ancak önceki sürümlerde 32 olarak değerlendirilir. Bunun x64 için Visual Studio 2013 C++ derleyicisinde 32 olarak değerlendirilmesini sağlamak için, işlevi olan sahte bir virtual temel sınıf ekleyin:

    __declspec(align(16)) struct S1 {
    };
    
    struct dummy {
        virtual ~dummy() {}
    };
    struct S2 : public dummy {
        virtual ~S2();
        void *p;
        S1 s;
    };
    

    Kodunuzda önceki bir sürümün iyileştirmeye çalışacağı yerleri bulmak için, derleyici seçeneğiyle /W3 birlikte bu sürümden bir derleyici kullanın ve uyarı C4370'i açın. Örneğin:

    #pragma warning(default:4370)
    
    __declspec(align(16)) struct S1 {
    };
    
    struct S2 {
        virtual ~S2();
        void *p;
        S1 s;
    };
    

    Visual Studio 2013'ten önce bu kod şu iletiyi döndürür: "uyarı C4370: 'S2' : sınıfın düzeni daha iyi paketleme nedeniyle derleyicinin önceki bir sürümünden değiştirildi".

    x86 derleyicisi, derleyicinin tüm sürümlerinde aynı altoptimal düzen sorununa sahiptir. Örneğin, bu kod x86 için derlenirse:

    struct S {
        virtual ~S();
        int i;
        double d;
    };
    

    sizeof(S) sonucu 24'tür. Ancak, x64 için belirtilen geçici çözümü kullanırsanız 16'ya düşürülebilir:

    struct dummy {
        virtual ~dummy() {}
    };
    
    struct S : public dummy {
        virtual ~S();
        int i;
        double d;
    };
    

Standart Kitaplık

Visual Studio 2013'teki C++ derleyicisi, Visual Studio 2010'da uygulanan _ITERATOR_DEBUG_LEVEL ve RuntimeLibrary uyuşmazlıklarını algılar. Derleyici seçenekleri /MT (statik sürüm), (statik hata ayıklama), /MTd (dinamik sürüm) /MD ve /MDd (dinamik hata ayıklama) karıştırıldığında bu uyuşmazlıklar oluşur.

  • Kodunuz önceki sürümün benzetimli takma ad şablonlarını tanıyorsa, bunu değiştirmeniz gerekir. Örneğin, yerine allocator_traits<A>::rebind_alloc<U>::otherşimdi de diyebilirsiniz allocator_traits<A>::rebind_alloc<U>. Artık ratio_add<R1, R2>::type gerekli olmasa da, şimdi ratio_add<R1, R2> kullanmanızı öneririz. Çünkü ratio<N, D>, azaltılmış bir oran için bir "tür" tanımına sahip olmalıdır ve eğer bu zaten azaltılmışsa, aynı tür olacaktır.

  • std::min() veya std::max() öğesini çağırırken #include <algorithm> kullanmanız gerekir.

  • Mevcut kodunuz önceki sürümün sanal kapsamlı sabit listelerini (ad alanlarına sarmalanmış geleneksel kapsamsız sabit listeleri) kullanıyorsa, bunu değiştirmeniz gerekir. Örneğin, std::future_status::future_status türüne başvurduysanız, şimdi std::future_status demelisiniz. Ancak, çoğu kod etkilenmez; örneğin, std::future_status::ready hala derlenmektedir.

  • explicit operator bool() unspecified-bool-type() işlecinden daha katıdır. explicit operator bool()bool türüne açık dönüşümlere (örneğin, hem shared_ptr<X> sp hem de static_cast<bool>(sp), bool b(sp) geçerli) ve bool türüne Boole sınaması yapılabilir "bağlamsal dönüşümlere" (örneğin, if (sp), !sp, sp && vb.) izin verir. Ancak, explicit operator bool() bool'a örtük dönüşümleri yasaklar, bu nedenle bool b = sp; diyemezsiniz ve bir bool dönüş türü için return sp de diyemezsiniz.

  • Artık gerçek variadic şablonlar uygulandığına göre, _VARIADIC_MAX ve ilgili makroların hiçbir etkisi yoktur. _VARIADIC_MAX tanımlamaya devam ediyorsanız, yoksayılır. Benzetilmiş değişen sayıda bağımsız değişken içeren şablonları farklı bir şekilde desteklemeye yönelik makro makinemizi kabul ettiyseniz, kodunuzu değiştirmeniz gerekir.

  • Normal anahtar kelimelere ek olarak, C++ Standart Kütüphanesi üstbilgileri artık "override" ve "final" gibi bağlama duyarlı anahtar kelimelerin makro değişimini yasaklıyor.

  • reference_wrapper, ref()ve cref() şimdi geçici nesnelere bağlamayı yasaklar.

  • <random> şimdi derleme zamanı önkoşullarını sıkı şekilde uygular.

  • Çeşitli C++ Standart Kitaplık türü özellikleri "T tam bir tür olmalıdır" ön koşuluna sahiptir. Derleyici artık bu önkoşulu daha katı bir şekilde zorlasa da, her durumda zorlamayabilir. (C++ Standart Kitaplığı önkoşul ihlalleri tanımsız davranış tetiklediğinden, Standart zorlamayı garanti etmez.)

  • C++ Standart Kütüphanesi /clr:oldSyntax'yi desteklemez.

  • : C++11 belirtiminin için beklenmeyen ve istenmeyen sonuçları vardı; özellikle, bu durum döndürüyor . Bu nedenle, derleyici, Kitaplık Çalışma Grubu konusu 2141 için Önerilen Çözümü uygular ve bu common_type<int, int="">::typeint olarak döner.

    Bu değişikliğin yan etkisi olarak, kimlik durumu artık çalışmıyor (common_type<T> her zaman T türüyle sonuçlanmaz). Bu davranış Önerilen Çözüm'e uygundur, ancak önceki davranışa bağlı olan tüm kodları bozar.

    Kimlik türü özelliğine ihtiyacınız varsa, <type_traits> içinde tanımlanan standart olmayan std::identity özelliğini kullanmayın çünkü <void> için çalışmaz. Bunun yerine, ihtiyaçlarınıza uygun kendi kimlik türü özelliğinizi oluşturun. Bir örnek aşağıda verilmiştir:

    template < typename T> struct Identity {
        typedef T type;
    };
    

MFC ve ATL

  • Yalnızca Visual Studio 2013: Unicode çok popüler olduğundan ve MBCS kullanımı önemli ölçüde azaldığından MFC MBCS Kitaplığı Visual Studio'ya dahil değildir. Yeni denetimlerin ve iletilerin çoğu salt Unicode olduğundan, bu değişiklik aynı zamanda MFC'yi Windows SDK ile daha paralel halde tutar. Ancak, MFC MBCS kitaplığını kullanmaya devam etmeniz gerekiyorsa, Visual Studio 2013 için Çok Baytlı MFC Kitaplığı'ndaki Microsoft İndirme Merkezi'nden indirebilirsiniz. Visual C++ Yeniden Dağıtılabilir Paketi'nde bu kitaplık halen yer almaktadır. (Not: MBCS DLL,Visual Studio 2015 ve sonraki sürümlerde C++ kurulum bileşenlerine dahildir).

  • MFC şeridinin erişilebilirliği değiştirildi. Tek düzeyli mimari yerine artık hiyerarşik bir mimari vardır. çağrısı CRibbonBar::EnableSingleLevelAccessibilityMode()yaparak eski davranışı kullanmaya devam edebilirsiniz.

  • CDatabase::GetConnect yöntemi kaldırılır. Güvenliği geliştirmek için bağlantı dizesi artık şifrelenmiş olarak depolanır ve şifresi yalnızca gerektiğinde çözülür; düz metin olarak döndürülemez. Dize, CDatabase::Dump yöntemi kullanılarak elde edilebilir.

  • CWnd::OnPowerBroadcast'ün imzası değiştirildi. Bu ileti işleyicisinin imzası ikinci parametre olarak bir LPARAM alacak şekilde değiştirilir.

  • İmzalar, ileti işleyicilerine uyacak şekilde değiştirilir. Aşağıdaki işlevlerin parametre listeleri yeni eklenen ON_WM_* ileti işleyicilerini kullanacak şekilde değiştirilmiştir:

    • CWnd::OnDisplayChange ileti eşlemesinde yeni ON_WM_DISPLAYCHANGE makrosunun kullanılabilmesi için (WPARAM, LPARAM) yerine (UINT, int, int) olarak değiştirildi.

    • CFrameWnd::OnDDEInitiate yeni ON_WM_DDE_INITIATE makronun ileti eşlemesinde kullanılabilmesi için (WPARAM, LPARAM) yerine (CWnd*, UINT, UNIT) olarak değiştirildi.

    • CFrameWnd::OnDDEExecute, yeni ON_WM_DDE_EXECUTE makrosunun ileti eşlemesinde kullanılabilmesi için (WPARAM, LPARAM) yerine (CWnd*, HANDLE) olarak değiştirildi.

    • CFrameWnd::OnDDETerminate, yeni ON_WM_DDE_TERMINATE makrosunun ileti eşlemesinde kullanılabilmesi için, (WPARAM, LPARAM) yerine (CWnd*) parametresi olarak değiştirildi.

    • CMFCMaskedEdit::OnCut yeni ON_WM_CUT makronun ileti eşlemesinde kullanılabilmesi için (WPARAM, LPARAM) yerine parametre yok olarak değiştirildi.

    • CMFCMaskedEdit::OnClear yeni ON_WM_CLEAR makrosunun ileti eşlemesinde kullanılabilmesi için (WPARAM, LPARAM) yerine parametresiz olarak değiştirildi.

    • CMFCMaskedEdit::OnPaste, yeni ON_WM_PASTE makrosunun ileti eşlemesinde kullanılabilmesi için (WPARAM, LPARAM) parametreleri yerine parametresiz olacak şekilde değiştirildi.

  • #ifdef MFC üst bilgi dosyalarındaki yönergeler kaldırılır. Desteklenmeyen Windows (#ifdef) sürümleriyle ilgili MFC üst bilgi dosyalarındaki çok sayıda WINVER < 0x0501 yönerge kaldırılır.

  • ATL DLL (atl120.dll) kaldırılır. ATL artık başlık dosyaları ve bir statik kütüphane (atls.lib) olarak sağlanmaktadır.

  • Atlsd.lib, atlsn.lib ve atlsnd.lib kaldırılır. Atls.lib artık, karakter kümesi bağımlılıkları veya hata ayıklamaya/yayınlamaya özgü kod içermez. Unicode/ANSI ve hata ayıklama/yayınlama için aynı çalıştığından, kitaplığın yalnızca tek bir sürümü gereklidir.

  • ATL/MFC İzleme aracı ATL DLL ile birlikte kaldırılır ve izleme mekanizması basitleştirilmiştir. Oluşturucu CTraceCategory artık bir parametre (kategori adı) alır ve TRACE makroları CRT hata ayıklama raporlama işlevlerini çağırır.

Visual Studio 2012'de Önemli Değişiklikler

Derleyici

  • /Yl Derleyici seçeneği değişti. Varsayılan olarak, derleyici belirli koşullar altında LNK2011 hatalara neden olabilecek bu seçeneği kullanır. Daha fazla bilgi için bkz. /Yl (Hata Ayıklama Kitaplığı için PCH Başvurusu Ekle).

  • kullanılarak /clrenum derlenen kodda, sınıf anahtar sözcüğü ortak dil çalışma zamanı (CLR) sabit listesi değil C++11 sabit listesi tanımlar. BIR CLR sabit listesi tanımlamak için erişilebilirliği konusunda açık olmanız gerekir.

  • Bağımlı bir adı açıkça belirlemek için şablon anahtar sözcüğünü kullanın (C++ Dil Standardı uyumluluğu). Aşağıdaki örnekte, belirsizliği çözmek için vurgulanan şablon anahtar sözcüğü zorunludur. Daha fazla bilgi için bkz. Bağımlı Türler için Ad Çözümlemesi.

    template < typename X = "", typename = "" AY = "">
    struct Container { typedef typename AY::template Rebind< X> ::Other AX; };
    
  • Aşağıdaki örnekte gösterildiği gibi, float türünde sabit ifadeye artık şablon bağımsız değişkeni olarak izin verilmiyor.

    template<float n=3.14>
    struct B {};  // error C2993: 'float': illegal type for non-type template parameter 'n'
    
  • Komut satırı seçeneği kullanılarak /GS derlenen ve bire bir güvenlik açığı olan kod, aşağıdaki sahte kod örneğinde gösterildiği gibi çalışma zamanında işleme sonlandırmaya yol açabilir.

    char buf[MAX]; int cch; ManipulateString(buf, &cch); // ... buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • x86 derlemeleri için varsayılan mimari SSE2 olarak değiştirilir; bu nedenle, derleyici SSE yönergelerini yayabilir ve kayan nokta hesaplamaları yapmak için XMM yazmaçlarını kullanır. Önceki davranışa geri dönmek istiyorsanız, mimariyi /arch:IA32 IA32 olarak belirtmek için derleyici bayrağını kullanın.

  • Derleyici, daha önce olmadığı durumlarda Derleyici Uyarısı (düzey 4) C4703 ve C4701 uyarılarını verebilir. Derleyici, işaretçi türündeki başlatılmamış yerel değişkenlerin kullanımı için daha güçlü denetimler uygular.

  • Yeni bağlayıcı bayrağı /HIGHENTROPYVA belirtildiğinde, Windows 8 genellikle bellek ayırmalarının 64 bit adres döndürmesine neden olur. (Windows 8'den önce, bu ayırmalar genellikle 2 GB'tan az olan adresleri döndürürdü.) Bu değişiklik, var olan kodda işaretçi kesme hatalarını ortaya çıkarabilir. Varsayılan olarak, bu anahtar açıktır. Bu davranışı devre dışı bırakmak için belirtin /HIGHENTROPYVA:NO.

  • Yönetilen derleyici (Visual Basic/C#) yönetilen derlemeler için de destekler /HIGHENTROPYVA . Ancak, bu durumda, /HIGHENTROPYVAswitch varsayılan olarak kapalıdır.

IDE

  • C++/CLI'da Windows Forms uygulamaları oluşturmamanızı önersek de, mevcut C++/CLI UI uygulamalarının bakımı desteklenir. Bir Windows Forms uygulaması veya başka bir .NET UI uygulaması oluşturmanız gerekiyorsa C# veya Visual Basic kullanın. Yalnızca birlikte çalışabilirlik amacıyla C++/CLI kullanın.

Paralel Desenler Kitaplığı ve Eşzamanlılık Çalışma Zamanı Kitaplığı

SchedulerType UmsThreadDefault numaralandırması kullanım dışı bırakıldı. UmsThreadDefault belirtimi kullanım dışı bir uyarı mesajı üretir ve dahili olarak ThreadScheduler şeklinde eşlenir.

Standart Kitaplık

  • C++98/03 ve C++11 standartları arasında önemli bir değişikliğin ardından, make_pair() çağrısı sırasında make_pair<int, int>(x, y) gibi açık şablon bağımsız değişkenleri kullanımı, genellikle Visual Studio 2012'deki Visual C++ ile derlenemez. Çözüm, make_pair()'ü her zaman, make_pair(x, y)'de olduğu gibi, açık bir şablon bağımsız değişkeni belirtilmeden çağırmaktır. Açık şablon bağımsız değişkenleri sağlamak işlevin amacını ortadan kaldırır. Eğer sonuçta elde edilen tür üzerinde tam denetime ihtiyacınız varsa, make_pair yerine pairpair<short, short>(int1, int2) gibi kullanın.

  • C++98/03 ve C++11 standartları arasında uyumsuzluk yaratan başka bir değişiklik: A, örtük olarak B'ye dönüştürülebiliyorsa ve B de örtük olarak C'ye dönüştürülebiliyorsa, ancak A'nın C'ye örtük dönüştürülmesi mümkün değilse, C++98/03 ve Visual Studio 2010, pair<A, X>'ün (örtük veya açıkça) pair<C, X>'e dönüştürülmesine izin veriyordu. (Diğer X türü burada ilgi çekici değildir ve çiftteki ilk türe özgü değildir.) Visual Studio 2012'deki C++ derleyicisi, A'nın örtük olarak C'ye dönüştürülemez olduğunu algılar ve çift dönüştürmeyi aşırı yükleme çözümlemesinden kaldırır. Bu değişiklik birçok senaryo için olumludur. Örneğin, func(const pair<int, int>&) ve func(const pair<string, string>&) aşırı yüklenirken, func() ile pair<const char *, const char *> çağrısı bu değişiklikle derlenecektir. Ancak bu değişiklik, agresif çift dönüştürmelerine dayalı kodu bozar. Bu tür kodlar genellikle dönüştürmenin bir bölümü açıkça gerçekleştirilerek düzeltilebilir; örneğin, make_pair(static_cast<B>(a), x) öğesini bekleyen bir işleve pair<C, X> geçirilmesiyle.

  • Visual Studio 2010, pre-işlemci mekanizması ile aşırı yüklemeleri ve özelleştirmeleri damgalayarak, en fazla 10 bağımsız değişkene kadar simüle edilmiş variadic şablonları kullandı. Visual Studio 2012'de bu sınır, kullanıcıların çoğunluğu için derleme sürelerini ve derleyici bellek tüketimini iyileştirmek için beş bağımsız değişkene indirgenir. Ancak, _VARIADIC_MAX proje genelinde açıkça 10 olarak tanımlayarak önceki sınırı ayarlayabilirsiniz.

  • C++11 17.6.4.3.1 [macro.names]/2, C++ Standart Kitaplığı üst bilgileri eklendiğinde anahtar sözcüklerin makroyla değiştirilmesini yasaklar. Başlıklar artık makroyla değiştirilen anahtar sözcükleri algılarsa derleyici hatası oluşturur. (_ALLOW_KEYWORD_MACROS tanımlama, bu tür kodların derlenabilmesine izin verir, ancak bu kullanımı kesinlikle önerilmez.) Özel durum olarak, üst bilgiler kullanaraknew#pragma push_macro("new")/#undef new/ kendilerini kapsamlı bir şekilde savunduğu için makro biçimine #pragma pop_macro("new") varsayılan olarak izin verilir. _ENFORCE_BAN_OF_MACRO_NEW tanımlamak tam olarak adının ima ettiği şeyi yapar.

  • C++ Standart Kitaplığı uygulaması, çeşitli iyileştirmeler ve hata ayıklama denetimleri uygulamak için Visual Studio sürümleri (2005, 2008, 2010, 2012) arasında ikili uyumluluğu kasıtlı olarak bozar. C++ Standart Kitaplığı kullanıldığında, farklı sürümler kullanılarak tek bir ikili dosyaya (EXE veya DLL) derlenen nesne dosyalarının ve statik kitaplıkların karıştırılması ve C++ Standart Kitaplığı nesnelerinin farklı sürümler kullanılarak derlenen ikili dosyalar arasında geçirilmesini yasaklar. Nesne dosyaları ve statik kütüphanelerin (Visual Studio 2010 ile derlenmiş C++ Standart Kütüphanesi kullanılanlar ile Visual Studio 2012'deki C++ derleyicisi kullanılarak derlenmiş olanların) farklı versiyonlarla karıştırılması, derleyicinin ana sürümünü içeren _MSC_VER makrosu uyumsuzluk nedeniyle bağlayıcı hataları gösterir (Visual Studio 2012'de Visual C++ için 1700). Bu denetim DLL karıştırmasını algılayamaz ve Visual Studio 2008 veya önceki sürümleri içeren karıştırmayı algılayamaz.

  • Visual Studio 2010'da uygulanan _ITERATOR_DEBUG_LEVEL uyuşmazlıklarını algılamaya ek olarak, Visual Studio 2012'deki C++ derleyicisi Çalışma Zamanı Kitaplığı uyuşmazlıklarını algılar. Derleyici seçenekleri /MT (statik sürüm), (statik hata ayıklama), /MTd (dinamik sürüm) /MD ve /MDd (dinamik hata ayıklama) karıştırıldığında bu uyuşmazlıklar oluşur.

  • operator<(), operator>(), operator<=() ve operator>=(), daha önce std::unordered_map ve stdext::hash_map kapsayıcı ailelerinde mevcut olsa da, bunların uygulanması yararlı değildi. Standart olmayan bu işleçler Visual Studio 2012'deki Visual C++ uygulamasından kaldırılmıştır. Buna ek olarak, operator==() ve operator!=()'in uygulanması, std::unordered_map ailesini kapsayacak şekilde stdext::hash_map ailesi için genişletilmiştir. (Yeni kodda stdext::hash_map ailesinin kullanımından kaçınmanızı öneririz.)

  • C++11 22.4.1.4 [locale.codecvt], codecvt::length() ve codecvt::do_length() değiştirilebilir stateT& parametreler almalıdır şeklinde özellikler; ancak, Visual Studio 2010 const stateT& aldı. Visual Studio 2012'deki C++ derleyicisi, standart tarafından zorunlu kılındığı şekilde stateT& alır. Bu fark, sanal işlevini do_length()geçersiz kılmaya çalışan herkes için önemlidir.

CRT

  • new ve malloc() için kullanılan C Çalışma Zamanı (CRT) yığını artık özel değildir. CRT artık işlem yığınını kullanır. Bu, bir DLL kaldırıldığında yığının yok edilmediği anlamına gelir, bu nedenle CRT'ye statik olarak bağlanan DLL'ler, DLL kodu tarafından ayrılan belleğin kaldırılmadan önce temizlendiğinden emin olmalıdır.

  • iscsymf() işlevi negatif değerlerle doğrulama yapar.

  • Yapı threadlocaleinfostruct , yerel ayar işlevlerindeki değişikliklere uyum sağlamak için değişti.

  • gibi memxxx()strxxx() karşılık gelen iç öğelere sahip CRT işlevleri intrin.h dosyasından kaldırılır. Yalnızca bu işlevler için intrin.h dosyasını eklediyseniz, ilgili CRT üst bilgilerini eklemeniz gerekir.

MFC ve ATL

  • Fusion desteği kaldırıldı (afxcomctl32.h); bu nedenle, içinde <afxcomctl32.h> tanımlanan tüm yöntemler kaldırılmıştır. Üst bilgi dosyaları <afxcomctl32.h> ve <afxcomctl32.inl> silinmiş.

  • öğesinin adı CDockablePane::RemoveFromDefaultPaneDividier olarak CDockablePane::RemoveFromDefaultPaneDividerdeğiştirildi.

  • imza CFileDialog::SetDefExt LPCTSTR kullanacak şekilde değiştirildi; bu nedenle Unicode derlemeleri etkilenecektir.

  • Eski ATL izleme kategorileri kaldırıldı.

  • const CRect öğesini almak için CBasePane::MoveWindow imzası değiştirildi.

  • öğesinin imzası CMFCEditBrowseCtrl::EnableBrowseButtondeğiştirildi.

  • m_fntTabs içinden m_fntTabsBold ve CMFCBaseTabCtrl kaldırıldı.

  • Oluşturuculara CMFCRibbonStatusBarPane bir parametre eklendi. (Bu varsayılan bir parametredir ve bu nedenle kaynak sisteminde bozulmalara neden olmaz.)

  • Oluşturucuya CMFCRibbonCommandsListBox bir parametre eklendi. (Bu varsayılan bir parametredir ve bu nedenle kaynağı bozmaz.)

  • AFXTrackMouse API (ve ilgili zamanlayıcı proc) kaldırıldı. Bunun yerine Win32 TrackMouseEvent API'sini kullanın.

  • Oluşturucuya CFolderPickerDialog bir parametre eklendi. (Varsayılan bir parametredir ve bu nedenle kaynak kodunu bozmaz.)

  • CFileStatus yapı boyutu değiştirildi: m_attribute üyesi, GetFileAttributes tarafından döndürülen değere uyması için BYTE'den DWORD'ye değiştirildi.

  • CRichEditCtrl ve CRichEditView Unicode derlemelerinde RICHEDIT_CLASS (RichEdit 3.0 denetimi) yerine MSFTEDIT_CLASS (RichEdit 4.1 denetimi) kullanın.

  • Windows Vista, Windows 7 ve Windows 8'de her zaman doğru olduğu için AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground kaldırıldı.

  • Windows Vista, Windows 7 ve Windows 8'de her zaman doğru olduğu için AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable kaldırıldı.

  • AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea kaldırıldı. Windows API'sini doğrudan Windows Vista, Windows 7 ve Windows 8'de çağır.

  • kaldırıldı AFX_GLOBAL_DATA::DwmDefWindowProc. Windows API'sini doğrudan Windows Vista, Windows 7 ve Windows 8'de çağır.

  • AFX_GLOBAL_DATA::DwmIsCompositionEnabled adı, ad çakışmasını ortadan kaldırmak için IsDwmCompositionEnabled olarak değiştirildi.

  • Bir dizi MFC iç zamanlayıcısının tanımlayıcıları değiştirildi ve tanımları afxres.h (AFX_TIMER_ID_*) adresine taşıdı.

  • yöntemin OnExitSizeMove imzası, ON_WM_EXITSIZEMOVE makroyla anlaşacak şekilde değiştirildi:

    • CFrameWndEx

    • CMDIFrameWndEx

    • CPaneFrameWnd

  • adı ve imzası OnDWMCompositionChanged, ON_WM_DWMCOMPOSITIONCHANGED makroyla uyumlu olacak şekilde değiştirildi:

    • CFrameWndEx

    • CMDIFrameWndEx

    • CPaneFrameWnd

  • yöntemin OnMouseLeave imzası, ON_WM_MOUSELEAVE makroyla anlaşacak şekilde değiştirildi:

    • CMFCCaptionBar

    • CMFCColorBar

    • CMFCHeaderCtrl

    • CMFCProperySheetListBox

    • CMFCRibbonBar

    • CMFCRibbonPanelMenuBar

    • CMFCRibbonRichEditCtrl

    • CMFCSpinButtonCtrl

    • CMFCToolBar BuMetniDeğiştir

    • CMFCToolBarComboBoxEdit

    • CMFCToolBarEditCtrl

    • CMFCAutoHideBar

  • OnPowerBroadcast imzası, ON_WM_POWERBROADCAST makrosuna uyması için değiştirildi.

    • CFrameWndEx

    • CMDIFrameWndEx

  • OnStyleChanged imzası ON_WM_STYLECHANGED makrosuyla uyumlu olacak şekilde değiştirildi.

    • CMFCListCtrl

    • CMFCStatusBar

  • İç yöntemi FontFamalyProcFonts olarak FontFamilyProcFontsyeniden adlandırıldı.

  • Bazı durumlarda bellek sızıntılarını (#defines ile değiştirilir) ve aşağıdaki sınıf üyesi değişkenlerini ortadan kaldırmak için çok sayıda genel statik CString nesne kaldırıldı:

    • CKeyBoardManager::m_strDelimiter

    • CMFCPropertyGridProperty::m_strFormatChar

    • CMFCPropertyGridProperty::m_strFormatShort

    • CMFCPropertyGridProperty::m_strFormatLong

    • CMFCPropertyGridProperty::m_strFormatUShort

    • CMFCPropertyGridProperty::m_strFormatULong

    • CMFCPropertyGridProperty::m_strFormatFloat

    • CMFCPropertyGridProperty::m_strFormatDouble

    • CMFCToolBarImages::m_strPngResType

    • CMFCPropertyGridProperty::m_strFormat

  • hızlandırıcı sınırlayıcısı parametresinin CKeyboardManager::ShowAllAccelerators imzası değiştirildi ve kaldırıldı.

  • CPropertyPage::GetParentSheet eklendi ve CPropertyPage sınıfında, doğru üst sayfa penceresini almak için GetParent yerine bunu çağırın. Bu, CPropertyPage için üst veya üst ebeveyn pencere olabilir. Kodunuzu, `GetParent` yerine `GetParentSheet` çağırmak için değiştirmeniz gerekebilir.

  • ATLBASE.H dosyasında dengesiz #pragma warning(push) düzeltilerek uyarıların yanlış şekilde devre dışı bırakılması sorunu giderildi. Bu uyarılar, ATLBASE.H ayrıştırıldıktan sonra doğru şekilde etkinleştirilmiştir.

  • D2D ile ilgili yöntemler AFX_GLOBAL_DATA'dan _AFX_D2D_STATE'e taşındı.

    • GetDirectD2dFactory

    • GetWriteFactory

    • GetWICFactory

    • InitD2D

    • ReleaseD2DRefs

    • IsD2DInitialized

    • D2D1MakeRotateMatrix

    • Örneğin, afxGlobalData.IsD2DInitialized yerine AfxGetD2DState->IsD2DInitialized öğesini çağırın.

  • Eski ATL*.CPP dosyaları \atlmfc\include\ klasöründen kaldırıldı.

  • Başlatma afxGlobalData, gereksinimleri karşılamak için CRT başlatma zamanı yerine isteğe bağlı hale getirildiDLLMain.

  • RemoveButtonByIndex yöntemi sınıfına CMFCOutlookBarPane eklendi.

  • CMFCCmdUsageCount::IsFreqeuntlyUsedCmd IsFrequentlyUsedCmd olarak düzeltildi.

  • Birkaç RestoreOriginalstate örneği RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane) olarak düzeltildi.

  • CDockablePane, SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo ve CanAdjustLayout öğelerinden kullanılmayan yöntemler kaldırıldı.

  • CDockablePane statik üye değişkenleri m_bCaptionText ve m_bHideDisabledButtons kaldırıldı.

  • DeleteString öğesine bir CMFCFontComboBox geçersiz kılma yöntemi eklendi.

  • ' den CPanekullanılmayan yöntemler kaldırıldı: GetMinLength ve IsLastPaneOnLastRow.

  • CPane::GetDockSiteRow(CDockingPanesRow *) CPane::SetDockSiteRow olarak yeniden adlandırıldı.

Visual Studio 2010'da Önemli Değişiklikler

Derleyici

  • Anahtar auto sözcüğün yeni bir varsayılan anlamı vardır. Eski anlamın kullanımı nadir olduğundan çoğu uygulama bu değişiklikten etkilenmez.

  • Kodunuzda bu ada göre bir tanımlayıcı varsa ad çakışmasına neden olacak yeni static_assert anahtar sözcük kullanıma sunulmuştur.

  • Yeni lambda gösterimi desteği, IDL uuid özniteliğinde alıntılanmamış GUID kodlama desteğini dışlar.

  • .NET Framework 4, bir işlemi geri döndürülemez şekilde bozulmuş duruma getiren bozuk durum özel durumları kavramını tanıtır. Varsayılan olarak, diğer tüm özel durumları yakalayan /EHa derleyici seçeneğiyle bile bozuk durum özel durumunu yakalayamazsınız. Bozuk durum istisnasını açıkça yakalamak için __try-__except deyimlerini kullanın. Veya bir işlevin bozuk durum istisnalarını yakalamasını sağlamak için [HandledProcessCorruptedStateExceptions] özniteliğini uygulayın. Bu değişiklik öncelikle bozuk bir hata durumunu yakalaması gerekebilecek sistem programcılarını etkiler. Sekiz özel durum STATUS_ACCESS_VIOLATION, STATUS_STACK_OVERFLOW, EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_INVALID_DISPOSITION, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_PRIV_INSTRUCTION, STATUS_UNWIND_CONSOLIDATE'dır. Bu özel durumlar hakkında daha fazla bilgi için getExceptionCode makrosna bakın.

  • Düzeltilen /GS derleyici seçeneği, önceki sürümlerden daha kapsamlı arabellek taşmalarına karşı koruma sağlar. Bu sürüm, yığına performansı düşürebilecek ek güvenlik denetimleri ekleyebilir. Derleyiciye belirli bir işlev için güvenlik denetimleri eklememesi talimatı vermek için yeni __declspec(safebuffers) anahtar sözcüğünü kullanın.

  • Hem /GL (Tüm Program İyileştirme) hem de /clr (Ortak Dil Çalışma Zamanı Derlemesi) derleyici seçenekleriyle derlerseniz, /GL seçeneği yoksayılır. Derleyici seçeneklerinin birleşimi çok az avantaj sağladığından bu değişiklik yapıldı. Sonuç olarak bu değişiklik ile derlemenin performansı iyileşti.

  • Varsayılan olarak, visual studio 2010'da trigraf desteği devre dışıdır. /Zc:trigraphs Trigraf desteğini etkinleştirmek için derleyici seçeneğini kullanın. Trigraf, ardışık iki soru işaretinden ("??") ve ardından benzersiz bir üçüncü karakterden oluşur. Derleyici, bir trigrafı karşılık gelen noktalama karakteriyle değiştirir. Örneğin, derleyici trigrafı ??= '#' karakteriyle değiştirir. C kaynak dosyalarında bazı noktalama işaretleri için uygun grafik gösterimleri içermeyen bir karakter kümesi kullanan trigraflar kullanın.

  • Bağlayıcı artık Windows 98 için iyileştirmeyi desteklememektedir. /OPT (İyileştirmeler) seçeneği, /OPT:WIN98 veya /OPT:NOWIN98 belirtirseniz derleme zamanında bir hata oluşturur.

  • RuntimeLibrary ve DebugInformationFormat derleme sistemi özellikleri tarafından belirtilen varsayılan derleyici seçenekleri değiştirildi. Varsayılan olarak, bu derleme özellikleri Visual C++ sürüm 7.0 ile 10.0 arasında oluşturulan projelerde belirtilir. Visual C++ 6.0 tarafından oluşturulan bir projeyi geçirirseniz, bu özellikler için bir değer belirtip belirtmeyeceğinize dikkat edin.

  • Visual Studio 2010'da RuntimeLibrary = MultiThreaded (/MD) ve DebugInformationFormat = ProgramDatabase (/Zi). Visual C++ 9.0'da RuntimeLibrary = MultiThreaded (/MT) ve DebugInformationFormat = Disabled.

CLR

  • Microsoft C# ve Visual Basic derleyicileri artık birincil birlikte çalışma derlemesi olmadan (no-PIA) derleme üretebilir. PIA içermeyen bir derleme, ilgili birincil birlikte çalışma derlemesinin (PIA) dağıtımına gerek kalmadan COM türlerini kullanabilir. Visual C# veya Visual Basic tarafından üretilen No-PIA derlemelerini kullanırken, kitaplığı kullanan herhangi bir No-PIA derlemesine başvurmadan önce derleme komutunda PIA derlemesine mutlaka başvurmanız gerekir.

Visual Studio C++ projeleri ve MSBuild

  • Visual Studio C++ projeleri artık MSBuild aracını temel alır. Sonuç olarak, proje dosyaları yeni bir XML dosya biçimi ve .vcxproj dosya son eki kullanır. Visual Studio 2010, visual studio'nun önceki sürümlerindeki proje dosyalarını otomatik olarak yeni dosya biçimine dönüştürür. Mevcut proje, önceki derleme aracına, VCBUILD.exe veya proje dosyası son eki .vcproj'a bağlıysa etkilenir.

  • Önceki sürümlerde Visual C++ özellik sayfalarının geç değerlendirilmesini desteklemektedir. Örneğin, bir ana özellik sayfası, bağlı bir özellik sayfasını içe aktarabilir ve ana sayfa, diğer değişkenleri tanımlamak için bağlı sayfada tanımlanan bir değişkeni kullanabilir. Geç değerlendirme, alt özellik sayfası içeri aktarılmadan önce bile ebeveynin alt değişkeni kullanmasına olanak sağladı. Visual Studio 2010'da, MSBuild yalnızca erken değerlendirmeyi desteklediği için, proje sayfası değişkeni tanımlanmadan önce kullanılamaz.

IDE

  • Uygulama sonlandırma iletişim kutusu artık bir uygulamayı sonlandırmaz. Önceki sürümlerde, abort() veya terminate() işlevi bir uygulamanın perakende derlemesini kapattığında, C Çalışma Zamanı Kitaplığı konsol penceresinde veya iletişim kutusunda bir uygulama sonlandırma iletisi görüntüledi. İletide kısmen şöyle dendi: "Bu uygulama Çalışma Zamanı'nın onu alışılmadık bir şekilde sonlandırmasını istedi." Daha fazla bilgi için lütfen uygulamanın destek ekibine başvurun." Windows daha sonra genellikle Windows Hata Bildirimi (Dr. Watson) iletişim kutusu veya Visual Studio hata ayıklayıcısı olan geçerli sonlandırma işleyicisini görüntülediğinden, uygulama sonlandırma iletisi yedekliydi. Visual Studio 2010'dan başlayarak, C Çalışma Zamanı Kitaplığı iletiyi görüntülemez. Ayrıca, çalışma zamanı bir hata ayıklayıcı başlamadan önce uygulamanın sona ermesini engeller. Bu, yalnızca uygulama sonlandırma iletisinin önceki davranışına bağlıysanız önemli bir değişikliktir.

  • Özellikle Visual Studio 2010 için IntelliSense C++/CLI kodu veya öznitelikleri için çalışmaz, Tüm Başvuruları Bul yerel değişkenler için çalışmaz ve Kod Modeli içeri aktarılan derlemelerden tür adlarını almaz veya türleri tam adlarıyla çözümlemez.

Kitaplıklar

  • SafeInt sınıfı Visual C++ ile birlikte gelir ve artık ayrı bir indirmede bulunmaz. Bu, yalnızca "SafeInt" adındaki bir sınıf geliştirdiyseniz önemli bir değişikliktir.

  • Kitaplık dağıtım modeli artık dinamik bağlantı kitaplığının belirli bir sürümünü bulmak için bildirimleri kullanmıyor. Bunun yerine, her dinamik bağlantı kitaplığının adı sürüm numarasını içerir ve kitaplığı bulmak için bu adı kullanırsınız.

  • Visual Studio'nun önceki sürümlerinde çalışma zamanı kitaplıklarını yeniden oluşturabilirsiniz. Visual Studio 2010 artık C çalışma zamanı kitaplık dosyalarının kendi kopyalarını derlemeyi desteklememektedir.

Standart Kitaplık

  • Artık <iterator> başlığı birçok diğer başlık dosyası tarafından otomatik olarak eklenmiyor. Bunun yerine, başlık dosyasında tanımlı bağımsız yineleyiciler için desteğe ihtiyaç duyuyorsanız, bu başlık dosyasını açıkça ekleyin. Mevcut proje, önceki derleme aracı VCBUILD.exe'e veya proje dosyası soneki olan .vcproj.iterator'a bağlıysa etkilenir.

  • Üst bilgide <algorithm>, checked_* ve unchecked_* işlevleri kaldırıldı. Üst bilgisinde <iterator>> sınıf checked_iterator kaldırılır ve unchecked_array_iterator sınıfı eklenir.

  • CComPtr::CComPtr(int) Oluşturucu kaldırılır. Bu oluşturucu bir CComPtr nesnenin NULL makrodan oluşturulmasına izin verdi, ancak gereksizdi ve sıfır olmayan tamsayılardan gerekli olmayan yapılara izin verdi.

    A CComPtr , 0 olarak tanımlanan NULL değerinden yine de oluşturulabilir, ancak değişmez değer 0 dışında bir tamsayıdan oluşturulursa başarısız olur. Bunun yerine nullptr kullanın.

  • Aşağıdaki ctype üye işlevleri kaldırıldı: ctype::_Do_narrow_s, ctype::_Do_widen_s, ctype::_narrow_s, ctype::_widen_s. Bir uygulama bu üye işlevlerinden birini kullanıyorsa, bunu ilgili güvenli olmayan sürümle değiştirmeniz gerekir: ctype::do_narrow, ctype::do_widen, ctype::narrow, ctype::widen.

CRT, MFC ve ATL Kitaplıkları

  • Kullanıcıların CRT, MFC ve ATL kitaplıklarını oluşturmasına yönelik destek kaldırıldı. Örneğin, uygun NMAKE dosyası sağlanmadı. Ancak, kullanıcılar bu kitaplıkların kaynak koduna erişmeye devam eder. Ayrıca, Microsoft'un bu kitaplıkları oluşturmak için kullandığı MSBuild seçeneklerini açıklayan bir belge büyük olasılıkla bir Visual C++ Ekip Blogu'nda yayınlanacaktır.

  • IA64 için MFC desteği kaldırıldı. Ancak, IA64 üzerinde CRT ve ATL desteği hala sağlanır.

  • Sıra numaraları artık MFC modül tanım dosyalarında (.def) yeniden kullanılmıyor. Bu değişiklik, ikincil sürümler arasında ordinal değerlerin farklı olmaması ve hizmet paketleri ile hızlı düzeltme mühendislik sürümleri için ikili uyumun artırılması anlamına gelir.

  • sınıfına CDocTemplate yeni bir sanal işlev eklendi. Bu yeni sanal işlev CDocTemplate Sınıfıdır. önceki sürümünde OpenDocumentFile iki parametre vardı. Yeni sürümde üç parametre vardır. Yeniden başlatma yöneticisini desteklemek için, öğesinden CDocTemplate türetilen herhangi bir sınıfın üç parametresi olan sürümü uygulaması gerekir. Yeni parametre: bAddToMRU.

Makrolar ve Ortam Değişkenleri

  • ortam değişkeni __MSVCRT_HEAP_SELECT artık desteklenmiyor. Bu ortam değişkeni kaldırılır ve değiştirme yoktur.

Microsoft Macro Assembler Referans

  • Microsoft Makro Derleyicisi Referansından çeşitli yönergeler kaldırıldı. Kaldırılan yönergeler : .186, .286, .286P, .287, .8086, .8087ve .NO87.

Visual Studio 2008'de Önemli Değişiklikler

Derleyici

  • Windows 95, Windows 98, Windows ME ve Windows NT platformları artık desteklenmiyor. Bu işletim sistemleri hedeflenen platformlar listesinden kaldırılmıştır.

  • Derleyici artık DOĞRUDAN ATL Sunucusu ile ilişkilendirilmiş birden çok özniteliği desteklemez. Aşağıdaki öznitelikler artık desteklenmiyor:

    • performans sayacı

    • perf_object

    • performans izleme aracı (perfmon)

    • istek işleyici

    • SOAP işleyici

    • soap_başlık

    • sabun_yöntemi

    • etiket_adı

Visual Studio C++ projeleri

  • Visual Studio'nun önceki sürümlerinden projeleri yükseltirken, WINVER ve _WIN32_WINNT makrolarını 0x0500'den büyük veya eşit olacak şekilde değiştirmeniz gerekebilir.

  • Visual Studio 2008'den başlayarak, yeni proje sihirbazının C++ SQL Server projesi oluşturma seçeneği yoktur. Visual Studio'nun önceki bir sürümü kullanılarak oluşturulan SQL Server projeleri yine de derlenir ve düzgün çalışır.

  • Windows API üst bilgi dosyası Winable.h kaldırıldı. Bunun yerine Winuser.h dosyasını ekleyin.

  • Windows API kitaplığı Rpcndr.lib kaldırıldı. Bunun yerine rpcrt4.lib ile bağlantı.

CRT

  • Windows 95, Windows 98, Windows Millennium Edition ve Windows NT 4.0 desteği kaldırıldı.

  • Aşağıdaki genel değişkenler kaldırıldı:

    • _osplatform

    • _osver

    • _winmajor

    • _winminor

    • _winver

  • Aşağıdaki işlevler kaldırıldı. Bunun yerine Windows API işlevlerini GetVersionGetVersionEx kullanın:

    • _get_osplatform

    • _get_osver

    • _get_winmajor

    • _get_winminor

    • _get_winver

  • SAL Ek Açıklamalarının söz dizimi değişti. Daha fazla bilgi için bkz . SAL Ek Açıklamaları.

  • IEEE filtresi artık SSE 4.1 yönerge kümesini destekliyor. Daha fazla bilgi için bkz. _fpieee_flt.

  • Visual Studio ile birlikte gelen C Çalışma Zamanı Kütüphaneleri artık sistem DLL'si msvcrt.dll'ye bağımlı değildir.

Standart Kitaplık

  • Windows 95, Windows 98, Windows Millennium Edition ve Windows NT 4.0 desteği kaldırıldı.

  • _HAS_ITERATOR_DEBUGGING tanımlandığında (Visual Studio 2010'dan sonra _ITERATOR_DEBUG_LEVEL ile değiştirilen) hata ayıklama modunda derlenirken, bir yineleyici temel kapsayıcının sınırlarını aşacak şekilde arttırmaya veya azaltmaya çalıştığında, uygulama artık bu durumu doğrulayacak.

  • Stack Sınıfının c üye değişkeni artık korumalı olarak bildirilir. Daha önce bu üye değişkeni genel olarak bildirildi.

  • money_get::do_get'nun davranışı değişti. Daha önce, bir parasal tutarı ayrıştırırken, gerekenin üzerinde kesir basamakları varsa, frac_digitsdo_get bunların tümünü tüketirdi. Şimdi, do_get en fazla frac_digits karakter tüketildikten sonra ayrıştırma durdurulur.

Atlanta Havalimanı

  • ATL, CRT bağımlılığı olmadan oluşturulamaz. Visual Studio'nun önceki sürümlerinde, atl projesini CRT'ye en az bağımlı hale getirmek için #define ATL_MIN_CRT kullanabilirsiniz. Visual Studio 2008'de, ATL_MIN_CRT tanımlanıp tanımlanmadığına bakılmaksızın tüm ATL projeleri en az CRT'ye bağımlıdır.

  • ATL Server kod tabanı CodePlex'te paylaşılan kaynak projesi olarak yayımlanmıştır ve Visual Studio'nun bir parçası olarak yüklenmemiştir. atlenc.h dosyasından veri kodlama ve kod çözme sınıfları ve atlutil.h ve atlpath.h'den yardımcı program işlevleri ve sınıfları tutulmuştur ve artık ATL kitaplığının bir parçasıdır. ATL Sunucusu ile ilişkilendirilmiş birkaç dosya artık Visual Studio'nun parçası değildir.

  • Bazı işlevler artık DLL'ye eklenmez. Bunlar hala içeri aktarma kitaplığında yer almaktadır. Bu, işlevleri statik olarak kullanan kodu etkilemez. Yalnızca bu işlevleri dinamik olarak kullanan kodu etkiler.

  • PROP_ENTRY ve PROP_ENTRY_EX makroları kullanım dışı bırakıldı ve güvenlik nedeniyle PROP_ENTRY_TYPE ve PROP_ENTRY_TYPE_EX makrolarla değiştirildi.

ATL/MFC Paylaşılan Sınıfları

  • ATL, CRT bağımlılığı olmadan oluşturulamaz. Visual Studio'nun önceki sürümlerinde, bir ATL projesini CRT'ye en az bağımlı hale getirmek için kullanabilirsiniz #define ATL_MIN_CRT . Visual Studio 2008'de, ATL_MIN_CRT tanımlanıp tanımlanmadığına bakılmaksızın tüm ATL projeleri en az CRT'ye bağımlıdır.

  • ATL Server kod tabanı CodePlex'te paylaşılan kaynak projesi olarak yayımlanmıştır ve Visual Studio'nun bir parçası olarak yüklenmemiştir. atlenc.h dosyasından veri kodlama ve kod çözme sınıfları ve atlutil.h ve atlpath.h'den yardımcı program işlevleri ve sınıfları tutulmuştur ve artık ATL kitaplığının bir parçasıdır. ATL Sunucusu ile ilişkilendirilmiş birkaç dosya artık Visual Studio'nun parçası değildir.

  • Bazı işlevler artık DLL'ye eklenmez. Bunlar hala aktarım kütüphanesinde bulunur. Bu, işlevleri statik olarak kullanan kodu etkilemez. Yalnızca bu işlevleri dinamik olarak kullanan kodu etkiler.

MFC

  • CTime Sınıf: Sınıf CTime artık 1/1/1970 C.E. yerine 1/1/1900 C.E. tarihinden başlayarak tarihleri kabul eder.

  • MFC iletişim kutularındaki denetimlerin sekme sırası: MFC ActiveX denetimi sekme sırasına eklenirse, MFC iletişim kutusundaki birden çok denetimin doğru sekme sırası bozulr. Bu değişiklik bu sorunu düzeltmektedir.

    Örneğin, ActiveX denetimine ve çeşitli düzenleme denetimlerine sahip bir MFC iletişim kutusu uygulaması oluşturun. ActiveX denetimini düzenleme denetimlerinin sekme sırasının ortasına yerleştirin. Uygulamayı başlatın, sekme sırası ActiveX denetiminden sonra gelen bir düzenleme denetimine tıklayın ve ardından sekme tuşuna basın. Bu değişiklikten önce odak, sekme sırasına göre bir sonraki düzenleme denetimi yerine ActiveX denetiminden sonra düzenleme denetimine gitti.

  • CFileDialog Sınıf: CFileDialog sınıfının özel şablonları Windows Vista'ya otomatik olarak taşınamaz. Bunlar hala kullanılabilir, ancak Windows Vista stili iletişim kutularının ek işlevlerine veya görünümlerine sahip olmayacaktır.

  • CWnd Sınıf ve CFrameWnd Sınıf: CWnd::GetMenuBarInfo yöntemi kaldırıldı.

    yöntemi CFrameWnd::GetMenuBarInfo artık sanal olmayan bir yöntemdir. Daha fazla bilgi için bkz . Windows SDK'sında GetMenuBarInfo İşlevi .

  • MFC ISAPI desteği: MFC artık Internet Server Uygulama Programlama Arabirimi (ISAPI) ile uygulama derlemeyi desteklemiyor. BIR ISAPI uygulaması oluşturmak istiyorsanız, DOĞRUDAN ISAPI uzantılarını çağırın.

  • Kullanım dışı BıRAKıLAN ANSI API'leri: Birkaç MFC yönteminin ANSI sürümleri kullanım dışıdır. Bu yöntemlerin Unicode sürümlerini gelecekteki uygulamalarınızda kullanın. Daha fazla bilgi için Windows Vista Ortak Denetimleri için Derleme Gereksinimleri sayfasına bakın.

Visual Studio 2005'in Önemli Değişiklikleri

CRT

  • Birçok işlev kullanım dışı bırakıldı. Bkz. Kullanım Dışı CRT İşlevleri.

  • Birçok işlev artık parametrelerini doğrular ve geçersiz parametreler verilirse yürütmeyi durdurur. Bu doğrulama, geçersiz parametreler geçiren ve işlevin onları yoksaydığını varsayarak veya yalnızca bir hata kodu döndüreceğini umarak çalışan kodu bozabilir. Bkz. Parametre Doğrulama.

  • -2 dosya tanımlayıcı değeri, stdout ve stderr çıkış için kullanılamadığını belirtmek amacıyla artık kullanılmaktadır; örneğin, konsol penceresi olmayan bir Windows uygulamasında. Kullanılan önceki değer -1'ydi. Daha fazla bilgi için bkz . _fileno.

  • Tek iş parçacıklı CRT kitaplıkları (libc.lib ve libcd.lib) kaldırıldı. Çok iş parçacıklı CRT kitaplıklarını kullanın. Derleyici /ML bayrağı artık desteklenmiyor. Çok iş parçacıklı kod ile tek iş parçacıklı kod arasındaki performans farkının büyük olasılıkla önemli olduğu durumlarda bazı işlevlerin kilitlenmeyen sürümleri eklenmiştir.

  • Standardı daha iyi karşılamak için pow fonksiyonunun, pow(int, int) aşırı yüklemesi kaldırıldı.

  • %n biçim belirticisi artık printf işlev ailesinin hiçbirinde varsayılan olarak desteklenmemektedir çünkü doğası gereği güvenli değildir. %n ile karşılaşılırsa, varsayılan davranış geçersiz parametre işleyicisini çağırmaktır. %n desteğini etkinleştirmek için kullanın _set_printf_count_output (ayrıca bkz _get_printf_count_output. ).

  • sprintf şimdi işaretli sıfırın negatif işaretini yazdırır.

  • swprintf Standart ile uyumlu olacak şekilde değiştirilmiştir; artık bir boyut parametresi gerektiriyor. Boyut parametresi olmadan biçimi swprintf kullanım dışı bırakıldı.

  • _set_security_error_handler kaldırıldı. Bu işleve yapılan çağrıları kaldırın; varsayılan işleyici, güvenlik hatalarıyla başa çıkmanın çok daha güvenli bir yoludur.

  • time_t artık 64 bit bir değerdir (_USE_32BIT_TIME_T tanımlanmadığı sürece).

  • _spawn ve _wspawn işlevleri, C Standardı'nda belirtildiği üzere, başarıyla sonuçlandığında errno’a dokunulmaz.

  • RTC artık varsayılan olarak geniş karakterler kullanıyor.

  • /CLR veya /CLR:PURE ile derlenen uygulamalar için kayan nokta kontrol sözcük desteği işlevleri kullanım dışı bırakıldı. Etkilenen işlevler , _clear87, _clearfp, _control87, _controlfp, _fpreset, , _status87. _statusfp _CRT_MANAGED_FP_NO_DEPRECATE tanımlayarak kullanımdan kaldırma uyarısını devre dışı bırakabilirsiniz, ancak bu işlevlerin yönetilen kodda kullanımı tahmin edilemez ve desteklenmez.

  • Bazı işlevler artık sabit işaretçiler döndürmektedir. _CONST_RETURN tanımlanarak eski, non-const davranış yeniden etkinleştirilebilir. Etkilenen işlevler şunlardır:

    • memchr, wmemchr

    • strchr, wcschr, _mbschr, _mbschr_l

    • strpbrk, wcspbrk, _mbspbrk, _mbspbrk_l

    • strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

    • strstr, wcsstr, _mbsstr, _mbsstr_l

  • Setargv.obj veya Wsetargv.obj ile bağlanırken, komut satırında joker karakterin üzerine çift tırnak konularak genişletilmesinin engellenmesi artık mümkün değildir. Daha fazla bilgi için bkz Joker Karakter Bağımsız Değişkenlerini Genişletme.

Standart Kitaplık (2005)

  • Özel durum sınıfı (<exception> başlığında bulunur) std ad alanına taşındı. Önceki sürümlerde bu sınıf genel ad alanındaydı. Özel durum sınıfının bulunamadığını belirten hataları çözmek için aşağıdaki using deyimini kodunuza ekleyin: using namespace std;

  • çağrılırken valarray::resize()öğesinin valarray içeriği kaybolur ve varsayılan değerlerle değiştirilir. resize() yöntemi, valarray öğesini bir vektör gibi dinamik olarak büyütmek yerine yeniden başlatmaya yöneliktir.

  • Hata Ayıklama Yineleyicileri: C-Runtime Kütüphanesi'nin hata ayıklama sürümüyle oluşturulmuş ve yineleyicileri yanlış kullanan uygulamalar çalışma zamanında durum tespitlerini görmeye başlayabilir. Bu onayları devre dışı bırakmak için, Visual Studio 2010'dan sonra _ITERATOR_DEBUG_LEVEL yerine geçen _HAS_ITERATOR_DEBUGGING'i 0 olarak tanımlamanız gerekir. Daha fazla bilgi için bkz . Yineleyici Desteğinde Hata Ayıklama

Visual C++ .NET 2003 Önemli Değişiklikler

Derleyici

  • Tanımlanan ön işleme yönergesi (C2004) için artık kapatma parantezleri zorunludur.

  • Açık özelleştirmeler artık birincil şablondan şablon parametrelerini bulmaz (Derleyici Hatası C2146).

  • Korumalı üyeye (n) yalnızca (n) üyesi olduğu sınıftan (A) devralan bir sınıfın (B) üye işlevi aracılığıyla erişilebilir (Derleyici Hatası C2247).

  • Derleyicide geliştirilmiş erişilebilirlik denetimleri artık erişilemeyen temel sınıfları algılar (Derleyici Hatası C2248).

  • Yıkıcı ve/veya kopya oluşturucuya erişilemiyorsa (C2316) bir özel durum yakalanamaz.

  • İşlevlerin işaretçilerindeki varsayılan bağımsız değişkenlere artık izin verilmiyor (Derleyici Hatası C2383).

  • Statik veri üyesi türetilmiş sınıf aracılığıyla başlatılamıyor (Derleyici Hatası C2477).

  • 'nin başlatılmasına typedef standart tarafından izin verilmez ve şimdi derleyici hatası oluşturur (Derleyici Hatası C2513).

  • bool artık uygun bir türdür (Derleyici Hatası C2632).

  • UDC artık aşırı yüklenmiş işleçlerle (C2666) belirsizlik oluşturabilir.

  • Daha fazla ifade artık geçerli null işaretçi sabitleri olarak kabul edilir (Derleyici Hatası C2668).

  • şablon<> artık derleyicinin daha önce bunu ima ettiği yerlerde gereklidir (Derleyici Hatası C2768).

  • Bir üye işlevinin sınıf dışındaki açık uzmanlığı, işlev zaten bir şablon sınıfı özelleştirmesi (Derleyici Hatası C2910) aracılığıyla açıkça özelleştirilmişse geçerli değildir.

  • Kayan nokta türü olmayan şablon parametrelerine artık izin verilmiyor (Derleyici Hatası C2993).

  • Sınıf şablonları, şablon türü bağımsız değişkenleri olarak kullanılmasına izin verilmez (C3206).

  • Friend işlev adları artık kapsayıcı ad alanına tanıtılmayacak (Derleyici Hatası C3767'ye sebep olur).

  • Derleyici artık makroda fazladan virgül (C4002) kabul etmeyecektir.

  • Form başlatıcısı () ile yapılandırılmış POD türündeki bir nesne varsayılan olarak başlatılır (C4345).

  • Bağımlı bir adın tür olarak ele alınabilmesi için artık typename gereklidir (Derleyici Uyarısı (düzey 1) C4346).

  • Hatalı şablon özelleştirmeleri olarak kabul edilen işlevler artık bu şekilde değerlendirilmez (C4347).

  • Statik veri üyeleri türetilmiş sınıf (C4356) aracılığıyla başlatılamaz.

  • Bir dönüş türünde (Derleyici Uyarısı (düzey 3) C4686) kullanılmadan önce sınıf şablonu özelleştirmesinin tanımlanması gerekir.

  • Derleyici artık ulaşılamayan kod (C4702) bildiriyor.

Ayrıca bkz.

Visual Studio'da Visual C++'daki Yenilikler