Aracılığıyla paylaş


Visual C++ Yenilikler 2003 ile 2015 Arasında

Bu sayfa, Visual Studio 2015'ten 2003'e kadar tüm Visual C++ sürümleri için tüm "Yenilikler" sayfalarını toplar. Bu bilgiler, Visual Studio'nun önceki sürümlerinden yükseltme yaparken yararlı olabileceği durumlarda kolaylık sağlamak için sağlanır.

Uyarı

Visual Studio'nun geçerli sürümü hakkında bilgi için bkz. Visual Studio'da Visual C++ için yenilikler ve Visual Studio'daVisual C++'da Uyumluluk Geliştirmeleri.

Visual Studio 2015'teki C++'daki Yenilikler

Visual Studio 2015 ve sonraki sürümlerde, derleyici uyumluluğunda devam eden geliştirmeler bazen derleyicinin mevcut kaynak kodunuzu anlama biçimini değiştirebilir. Bu durumda, 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 ve bu farkları gidermek için kaynak kodu veya diğer değişiklikler gerektiğinde düzeltmeler genellikle küçük ve doğrudan yapılır. Daha önce kabul edilebilir olan ve değiştirilmesi gerekebilecek (önce) kaynak koduna ve bunları düzeltmek için düzeltmelere (sonra) birçok örnek ekledik.

Bu farklılıklar kaynak kodunuzu veya diğer derleme yapıtlarınızı etkileyebilir ancak Visual C++ sürümlerine yönelik güncelleştirmeler arasındaki ikili uyumluluğu etkilemez. Daha ciddi bir değişiklik türü, hataya neden olan değişiklik ikili uyumluluğu etkileyebilir, ancak bu tür ikili uyumluluk sonları yalnızca Visual C++'ın ana sürümleri arasında oluşur. Örneğin, Visual C++ 2013 ile Visual C++ 2015 arasında. Visual C++ 2013 ile Visual C++ 2015 arasında gerçekleşen hataya neden olan değişiklikler hakkında bilgi için bkz. Visual C++ değişiklik geçmişi 2003 - 2015.

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
    

    seçeneği genellikle 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 seçeneğiyle /Za derleme yaparken gerekliydi, çünkü olmadan /Za, döngünün sonundan sonra bir for döngüsü değişkeni kullanılmasına 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.

      // zc_forScope.cpp
      // compile with: /Zc:forScope- /Za
      // 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.exeile komut satırından çalıştırasınız. Bunun yerine vstest.console.exe kullanın

  • 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, değiştirilebilir 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;
      };
    

    Microsoft C++ derleyicisinin ö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ırmanız yeterlidir.

  • char_16_t ve char32_t

    Bu türler artık yerleşik olarak ele alındığından, veya diğer adları artık bir tür tanımında kullanamazsınız char16_tchar32_t . Kullanıcıların ve kitaplık yazarlarının sırasıyla ve char16_t diğer adları olarak tanımlaması char32_tuint16_tuint32_t 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 bildirimleri kaldırın typedef ve bu adlarla çakan diğer tanımlayıcıları yeniden adlandırın.

  • Tür olmayan şablon parametreleri

    Açık şablon bağımsız değişkenleri sağladığınızda tür olmayan şablon parametreleri içeren bazı kodlar artık tür uyumluluğu için doğru şekilde denetlenmektedir. Örneğin, aşağıdaki kod Visual C++'ın ö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 eşleşmediğinden geçerli derleyici doğru bir hata veriyor (parametre bir const üyesinin işaretçisidir, ancak f işlevi const 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 işlevleri kabul etmemektedir __declspec(align) . Bu her zaman yoksayılırdı, ancak şimdi bir derleyici hatası üretir.

      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.

  • İstisna yönetimi

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

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

    Sorun, kopyalama oluşturucusunun özel olmasıdır, bu nedenle nesne normal bir özel durum işleme 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 herkesçe erişilebilir olduğundan ve explicit ile işaretlenmediğinden emin olun.

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

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

    için parametre türünü catch 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, dize değişmez değerleri ve ardından boşluk içermeyen makrolar kullanıcı tanımlı değişmez değerler olarak yorumlanır ve bu da hatalara veya beklenmeyen sonuçlara neden olabilir. Ö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 bunu bir dize değişmez değeri "hello" olarak yorumladı ve ardından "orada" genişletilen bir makro ve ardından iki dize değişmez değeri birleştirilmişti. Visual Studio 2015'te derleyici bunu kullanıcı tanımlı değişmez değer olarak yorumlar, ancak tanımlanan eşleşen kullanıcı tanımlı değişmez değer _x olmadığı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 dize değişmez değeri ile makro arasına bir boşluk ekleyin.

  • Bitişik dize değişmez değerleri

    Ö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";
    

    İki dize arasına bir boşluk eklemeniz yeterlidir.

      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++ Boyutlu Serbest Bırakma adresinde bulunabilir. Değişiklikler, boyut parametresini alan genel delete işlecin biçimini ekler. Hataya neden olan değişiklik, daha önce aynı imzaya sahip bir işleç kullandıysanız (delete işlecine karşılık gelecek şekilde), derleyici hatası (C2956, yeni yerleştirmenin kullanıldığı noktada oluşur, çünkü bu, derleyicinin uygun bir eşleştirme delete işlecini tanımlamaya çalıştığı kod konumudur).

    İşlevvoid operator delete(void *, size_t), C++11'deki yerleştirme yeni işlevine karşılık gelen bir void * operator new(size_t, size_t) işleciydi. C++14 boyutlu serbest bırakma ile, bu delete işlev artık bir standart serbest bırakma fonksiyonu (global delete operatörü) haline gelmiştir. Standart, placement new operatörünün kullanıldığı durumda, karşılık gelen delete işlev aranıp olağan bir bellek serbest bırakma işlevi bulunursa, programın geçersiz olmasını şart koşar.

    Örneğin, kodunuzun hem yeni bir yerleştirme hem de yerleştirme silme işlemi tanımladığı varsayılarak:

      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. Yeni size_t yerleştirme ve işleçler delete dışında farklı bir tür kullanıp kullanamayacağınızı düşünün. türünün size_ttypedef derleyiciye bağımlı olduğunu, Visual C++'da için typedef olduğunu unsigned int unutmayın. Aşağıdaki gibi numaralandırılmış bir tür kullanmak iyi bir çözümdür:

      enum class my_type : size_t {};
    

    Ardından yerleştirme new ve delete tanımınızı değiştirin, 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 new ve delete tanımlarını tamsayı türüne geri döndürmek için 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, yeni yerleştirmeyi tamamen ortadan kaldırabilmenizdir. Kodunuz yerleştirme bağımsız değişkeninin ayrılan veya silinen nesnenin boyutu olduğu bir bellek havuzu uygulamak için yerleştirme yeni kullanıyorsa, boyutlandırılmış serbest bırakma özelliği kendi özel bellek havuzu kodunuzu değiştirmeye uygun olabilir ve yerleştirme işlevlerinden kurtulup yerleştirme işlevleri yerine kendi iki bağımsız değişken 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 delete işlevler yoktur ve yerleştirme silme işlecinizle çakışmaya neden olmaz.

  • Birleşim veri üyeleri

    Birleşimlerin veri üyeleri artık başvuru 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. Bunlar 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 için birleşimlerdeki anonim yapıların üyeleri için çalışma zamanı davranışı değişti. 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 yıkıcı artık birleşim kapsamı dışına çıktığında örtük olarak çağrılmaz. Aşağıdaki kodu göz önünde bulundurun: Birleşim U, yıkıcısı olan S adında bir yapının üye olarak bulunduğu anonim bir yapı içerir.

      #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 oluşturucu çağrılır ve f işlevinin yığını temizlendiğinde S için yıkıcı ç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, 'D' sınıfının is_base_of tarafından ilk çağrıldığında henüz tanımlanmamış olmasıdır.

    Bu durumda, düzeltme, sınıf tanımlanana kadar bu tür özellikleri kullanmamaktır. B ve D tanımlarını 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.

Visual Studio 2015 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, inline operator new hatalı olarak kabul edilir.

  • Sınıf dışı türlerde 'işleç türü()' (kullanıcı tanımlı dönüştürme) çağrısı Derleyicinin önceki sürümleri sınıf dışı türlerde sessizce yoksayılarak 'operator type()' çağrısı yapılmasına izin verdi. 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 ayrıntılı bir tür tanımlayıcılarında izin verilen typename önceki sürümleri; bu şekilde yazılmış kod, adsal 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;
    
  • Bir başlatıcı listesinden dizilerin tür kesintisi Derleyicinin önceki sürümleri, bir başlatıcı listesinden dizilerin tür kesintisini desteklemedi. Derleyici artık bu tür kesinti biçimini destekler ve sonuç olarak, başlatıcı listelerini 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ümünün tarihi aday kadar iyi başka bir adayı da dikkate almasına yol açtığında, çağrı belirsiz hale gelir ve derleyici, sonuç olarak C2668 derleyici hatasını verir.

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

    Örnek 1: Aşırı yüklenmiş işleve 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ş işleve 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 ek bir adayı geçmiş adaydan daha iyi bir eşleşme olarak değerlendirmesine neden olduğunda, çağrı yeni adaya net bir şekilde yönlendirilir ve bu da yazılımcının hedeflediği davranıştan olması muhtemel 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ükleme çözünürlüğünde değişiklik (sonra)

      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 geri yüklenmesi

    Derleyicinin önceki bir sürümü deyimlerle ilgili switch önceden var olan uyarıları kaldırdı; bu uyarılar artık geri yüklendi. Derleyici artık geri yüklenen uyarıları yayımlar ve belirli servis talepleri (varsayılan servis talebi dahil) ile ilgili uyarılar artık switch deyiminin son satırında değil, sorunlu olayı 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ı amaçlandığı şekilde bastırmak için, #pragma warning(disable:####) yönergesini ilk potansiyel sorun çıkarabilecek durumun üstündeki bir satıra taşımak gerekebilir. Geri yüklenen uyarılar aşağıdadı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 etkiler /Wall/WX)

    Derleyicinin önceki sürümleri üst dizin tanımlayıcısı '..' kullanımını algılamadı yönergelerinin yol adında #include . 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ış, programcının hedeflediği kaynak dosyadan farklı bir kaynak dosyası ekleyerek programın derlenme riskini veya bu göreli yolların diğer derleme ortamlarına taşınmayacağını ortaya çıkardı. 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 da kullanılması önerilir.

  • #pragma optimize() üst bilgi dosyasının geçmiş sonunu 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ı bağımsız değişkenleri tarafından ayarlanan iyileştirme bayraklarıyla çakışıyorsa verilir.

      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 uyarısı (gönderme) ve

    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 şimdi programcıya bu şekilde yazılmış kodu algılar ve bildirir ve etkinse eşleşen #pragma warning(pop)konumunda isteğe bağlı bir derleyici uyarısı C5031 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ısı (gönderme) (yalnızca etkiler /Wall/WX)

    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

    Önceki derleyici sürümleri, #pragma warning durumu değişikliklerini yeterince iyi izlemeyip, amaçlanan 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 olarak -- ve isteğe bağlı olarak #pragma warning(push) ve #pragma warning(pop)'in istenmeyen kullanımlarını bulmada programcıya yardımcı olması amacıyla C5031 ve C5032 numaralı yeni uyarılarda bulunur.

    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 olarak satır içi hale getirme özelliği, derleyicinin belirli kodlara artık ulaşılamediğini kanıtlamasına olanak tanıyabilir. 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
      }
    
  • pow(T, int)

    C++ standart kitaplığının önceki sürümleri, bir pow(T, int) işlev çağrısını bir dizi çarpma işlemine kaydeden pow bir işlev şablonu tanımlamıştı. Bu teknik, kayan nokta işlemlerinin doğası nedeniyle büyük miktarda yanlışlık tahakkuk eder ve son sonuçların önemli ölçüde yanlış olmasına neden olur. Visual Studio 2015 Güncelleştirme 1'de, işlev kullanılırken pow yanlışlıkla doğruluk kaybı yaşanmaması için bu davranış kaldırıldı. Ancak, pow sürümünün bunun doğru hesaplamasından çok daha hızlıydı. Bu değişiklik önemli bir performans regresyonuna neden oluyorsa ve projeniz hassas kayan nokta sonuçları gerektirmediyse (örneğin, projeniz /fp:fast ile zaten derleniyorsa), çağrısı pow yerine şu geçici çözüm işlevini kullanmayı göz önünde bulundurun:

    template <class T> 
    inline T pow_int(T x, int y) throw() {
         unsigned int n;
         if (y >= 0) {
             n = (unsigned int)(y);
         } else {
             n = (unsigned int)(-y);
         }
         for (T z = T(1); ; x *= x) {
             if ((n & 1) != 0) {
                 z *= x;
             }
             if ((n >>= 1) == 0) {
                 return (y < 0 ? T(1) / z : z);
             }
         }
    }
    

    Bu uygulama, Visual Studio'nun önceki sürümlerindekiyle aynıdır.

Visual Studio 2015 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 derleyicinin önceki sürümlerinin ayrıştırmadığı ifadelerde bulunan uyarılar ve hatalar döndürür.

    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 adı bir tür olarak belirtmek amacıyla gereken decltype anahtar sözcüğünü içermeyen bir typename ifadesini ayrıştırırken, 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ı isim 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 geçici üye değişkenleri olan bir sınıfı, bu işleçlerin varsayılan uygulamalarının otomatik olarak oluşturulmasını engelleyen önemsiz olmayan yapı ve atama işleçlerine sahip olduğunu düşünmektedir. 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) kopya/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 C++ 2015'in önceki sürümleri, statik üye işlevlerinin cv niteleyicilerine sahip olmasını sağladı. Bu davranış, Visual C++ 2015 ve Visual C++ 2015 Güncelleştirme 1'deki bir regresyondan kaynaklanır; Visual C++ 2013 ve Visual C++'nın önceki sürümleri bu şekilde yazılmış kodu reddeder. Visual C++ 2015 ve Visual C++ 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 sabit listesi iletme bildirimine izin verilmez (yalnızca etkiler /ZW )

    Windows Çalışma Zamanı (WinRT) için derlenen kod, yönetilen C++ kodunun .Net Framework için enum derleyici anahtarı kullanılarak derlenmesi gibi, türlerin önceden bildirilmesine /clr izin vermez. 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 eşleşmeyen yeni ve silme işleçlerinden kaynaklanan bellek sorunlarına neden olabilir (özellikle büyük boyutlu serbest bırakma ile birlikte kullanıldığında) 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.

Visual Studio 2015 Güncelleştirme 3'te Uyumluluk Geliştirmeleri

  • std::is_convertable artık kendi kendine atamayı (standart kitaplık) algılar Tür özelliğinin std::is_convertable önceki sürümleri, kopya oluşturucu silindiğinde veya özel olduğunda sınıf türünün kendi kendine atamasını doğru algılamadı. Şimdi, std::is_convertable<>::value silinmiş veya özel kopya oluşturucu ile bir sınıf türüne uygulandığında doğru olarak ayarlanmıştır false .

    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");
    

    Visual C++'ın önceki sürümlerinde, bu örneğin en altındaki statik onaylar, std::is_convertable<>::value değerinin hatalı olarak true'e ayarlanmış olması nedeniyle geçer. Şimdi, std::is_convertable<>::value statik onayların başarısız olmasına neden olarak doğru olarak olarak ayarlanmıştır false.

  • 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, çağrılmalarına izin vermeden önce varsayılan veya silinmiş önemsiz kopyanın erişim tanımlayıcısını denetlemedi ve oluşturucuları taşımadı. 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 kopyanın erişim tanımlayıcısını denetler ve oluşturucuları taşıyıp çağrılamayacağını belirler ve çağrılmadıysa, sonuç olarak derleyici uyarısı C2248'i gönderir.

      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 C++ 2008'de başlayan öznitelikli ATL kodu desteğini kaldırmanın bir 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
    

    Destek derleyiciden kaldırılana kadar öznitelikli ATL kodunu kullanmaya devam etmek istiyorsanız, veya /Wv:18 komut satırı bağımsız değişkenlerini derleyiciye geçirerek /wd4467 veya kaynak kodunuzu ekleyerek #pragma warning(disable:4467) bu uyarıyı 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ş #include üst bilgi (PCH) dosyaları kullanılırken ve -Yc derlemeleri arasında -Yu kaynak dosyalarda eşleşmeyen yönergeleri kabul etti. Bu şekilde yazılan kod artık derleyici tarafından kabul edilir. 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 ekleme dizinleri (yalnızca etkiler /Wall/WX)

    Uyumsuz kabul edilen derleyicinin önceki sürümleri, önceden derlenmiş üst bilgi (PCH) dosyaları kullanılırken ve -I derlemeleri arasında -Yc derleyiciye yönelik dizin (-Yu) komut satırı bağımsız değişkenlerini içerir. Bu şekilde yazılan kod artık derleyici tarafından kabul edilir. 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'teki C++ Yenilikler

Geliştirilmiş ISO C/C++ Standartları Desteği

Derleyici

MSVC şu ISO C++11 dil özelliklerini destekler:

  • İşlev şablonları için varsayılan şablon bağımsız değişkenleri.
  • Oluşturucuları görevlendirme
  • Açık dönüştürme işleçleri.
  • Başlatıcı listeleri ve standart başlatma.
  • Ham dize sabitleri.
  • Variadic şablonları.
  • Takma ad şablonları.
  • Silinen işlevler.
  • Statik olmayan veri üyesi başlatıcıları (NSDMI'ler).
  • Varsayılan işlevler. *
  • Şu ISO C99 dil özelliklerini destekler:
  • _Bool
  • Bileşik değişmezler.
  • Belirtilmiş başlatıcılar.
  • Bildirimleri kodla karıştırma.
  • Yeni derleyici seçeneği /Zc:strictStringskullanılarak değiştirilebilir değerlere dize değişmez değer dönüştürmesine izin verilmiyor olabilir. C++98'de, dize değişmez değerlerinden char* (ve geniş dize değişmez değerlerine wchar_t*) dönüştürme kullanım dışı bırakıldı. C++11'de dönüştürme tamamen kaldırıldı. Derleyici standartla tam olarak uyumlu olsa da, bunun yerine dönüştürmeyi /Zc:strictStrings denetleyebilmeniz için seçeneği sağlar. Varsayılan olarak seçenek kapalıdır. Bu seçeneği hata ayıklama modunda kullanırken STL'nin derlenmeyeceğini unutmayın.
  • rvalue/lvalue Başvuru Atamaları. C++11, rvalue referansları ile lvalue'lar ve rvalue'lar arasında net bir ayrım yapabilir. Daha önce, derleyici bunu belirli atama senaryolarında sağlamamıştı. Derleyiciyi C++ Dil Çalışma Kağıdı ile uyumlu hale getirmek için yeni bir derleyici seçeneği /Zc:rvalueCasteklendi (bkz. bölüm 5.4, [expr.cast]/1). Bu seçenek belirtilmediğinde varsayılan davranış, Visual Studio 2012'dekiyle aynıdır.

Uyarı

Varsayılan işlevlerde, üye düzeyinde taşıma oluşturucuları ve taşıma atama işleçlerini istemek için =default kullanılması desteklenmez.

C99 Kitaplıkları

Bu üst bilgilerde eksik işlevler için bildirimler ve uygulamalar eklenir: math.h, ctype.h, wctype.h, stdio.h, stdlib.h ve wchar.h. Ayrıca complex.h, stdbool.h, fenv.h ve inttypes.h yeni üst bilgileri ve içinde bildirilen tüm işlevler için uygulamalar da eklenir. Yeni C++ sarmalayıcı üst bilgileri (ccomplex, cfenv, cinttypes, ctgmath) vardır ve diğerleri güncellenmiştir (ccomplex, cctype, clocale, cmath, cstdint, cstdio, cstring, cwchar ve cwctype).

Standart Şablon Kitaplığı

C++11 açık dönüştürme işleçleri, başlatıcı listeleri, kapsamlı sabit listeleri ve variadic şablonları için destek. Tüm kapsayıcılar artık C++11 ayrıntılı öğe gereksinimlerini desteklemektedir. Bu C++14 özellikleri için destek:

  • "Saydam işleç funktörleri" daha az<>, daha büyük<>, artı<>, çarpar<> vb.
  • <make_unique T>(args...) ve make_unique<T[]>(n)
  • cbegin()/cend(), rbegin()/rend() ve crbegin()/crend() üye olmayan işlevler.
  • <atomik> çok sayıda performans geliştirmesi aldı.
  • < > type_traits büyük sabitleme ve kod düzeltmeleri aldı.

Önemli Değişiklikler

ISO C/C++ standartları için geliştirilmiş bu destek, C++11'e uyması ve Visual Studio 2013'teki Visual C++ içinde doğru şekilde derlenebilmesi için mevcut kodda değişiklik yapılmasını gerektirebilir.

Visual C++ Kitaplığı Geliştirmeleri

  • C++ REST SDK'sı eklenir. REST hizmetlerinin modern bir C++ uygulamasına sahiptir.
  • C++ AMP Doku desteği geliştirildi. Artık mipmap'ler ve yeni örnekleme modları için destek içerir.
  • PPL görevleri birden çok zamanlama teknolojisini ve asenkron hata ayıklamayı destekler. Yeni API'ler hem normal sonuçlar hem de özel durum koşulları için PPL görevlerinin oluşturulmasını sağlar.

C++ Uygulama Performansı

  • Otomatik Vektörleştirici artık kodunuzun daha hızlı çalışmasını sağlamak için daha fazla C++ desenini tanır ve iyileştirir.
  • ARM platformu ve Atom mikro mimari kod kalitesi geliştirmeleri.
  • __vectorcall çağırma kuralı eklenir. __vectorcall çağırma kuralını kullanarak vektör yazmaçlarını kullanmak için vektör türü argümanları geçin.
  • Yeni Bağlayıcı Seçenekleri. /Gw (derleyici) ve /Gy (assembler) anahtarları, daha yalın ikili dosyalar üretmek için bağlayıcı iyileştirmelerini etkinleştirir.
  • CPU ile GPU arasında veri kopyalamayı azaltmak veya ortadan kaldırmak için C++ AMP paylaşılan bellek desteği.

Profil Destekli İyileştirme (PGO) geliştirmeleri

  • PGO kullanılarak en iyi duruma getirilmiş uygulama çalışma kümesindeki düşüşten kaynaklanan performans iyileştirmeleri.
  • Windows Çalışma Zamanı uygulaması geliştirme için yeni PGO.

Windows Çalışma Zamanı Uygulaması Geliştirme Desteği

  • Değer yapılarındaki kutulu türler için destek.

    Artık IBox<int>^ yerine int gibi null olabilecek alanlar kullanarak değer türleri tanımlayabilirsiniz. Bu, alanların bir değere sahip olabileceği veya değerine nullptreşit olabileceği anlamına gelir.

  • Daha Zengin Özel Durum Bilgileri.

    C++/CX, zengin özel durum bilgilerinin uygulama ikili arabiriminde (ABI) yakalanmasını ve yayılmasını sağlayan yeni Windows hata modelini destekler; Buna çağrı yığınları ve özel ileti dizeleri dahildir.

  • Object::ToString() artık sanaldır.

    Artık kullanıcı tanımlı Windows Çalışma Zamanı başvuru türlerinde ToString'i geçersiz kılabilirsiniz.

  • Kullanım dışı API'ler için destek.

    Genel Windows Çalışma Zamanı API'leri artık kullanım dışı olarak işaretlenebilir ve derleme uyarısı olarak görünen ve geçiş kılavuzu sağlayabilecek özel bir ileti verilebilir.

  • Hata Ayıklayıcı Geliştirmeleri.

    Yerel/JavaScript birlikte çalışma hata ayıklama, Windows Çalışma Zamanı özel durum tanılama ve zaman uyumsuz kod hata ayıklama desteği (hem Windows Çalışma Zamanı hem de PPL).

Uyarı

Bu bölümde açıklanan C++'a özgü özelliklere ve iyileştirmelere ek olarak, Visual Studio'daki diğer geliştirmeler de daha iyi Windows Çalışma Zamanı uygulamaları yazmanıza yardımcı olabilir.

Tanılama Geliştirmeleri

  • Hata Ayıklayıcı Geliştirmeleri. Zaman uyumsuz hata ayıklama ve Yalnızca Kendi Kodum hata ayıklama desteği.
  • Kod Analizi Kategorileri. Artık kod hatalarını bulmanıza ve düzeltmenize yardımcı olması için Kod Çözümleyicisi'nden kategorilere ayrılmış çıkışı görüntüleyebilirsiniz.
  • XAML Diagnostik. Artık XAML'nizde kullanıcı arabirimi yanıt hızı ve pil kullanımı sorunlarını tanılayabilirsiniz.
  • Grafik ve GPU Hata Ayıklama geliştirmeleri.
  • Gerçek cihazlarda uzaktan kontrol ile yakalama ve çalma.
  • Eşzamanlı C++ AMP ve CPU hata ayıklama.
  • Geliştirilmiş C++ AMP çalışma zamanı tanılaması.
  • HLSL İşlem gölgelendiricisi izleme hata ayıklama.

3D Grafik İyileştirmeleri

  • Önceden çarpılmış alfa DDS biçimi için Görüntü İçeriği İşlem Hattı desteği.
  • Görüntü Düzenleyicisi, işleme için dahili olarak önceden çarpılmış alfa kullanır ve böylece koyu haleler gibi yapıtların işlenmesini önler.
  • Görüntü ve Model Düzenleyicileri. Kullanıcı tanımlı filtre oluşturma özelliği artık Görüntü Düzenleyicisi ve Model Düzenleyicisi'ndeki Gölgelendirici Tasarımcısı'nda desteklenmektedir.

IDE ve Üretkenlik

Geliştirilmiş Kod Biçimlendirmesi. C++ kodunuz için daha fazla biçimlendirme ayarı uygulayabilirsiniz. Bu ayarları kullanarak, küme ayraçlarının ve anahtar sözcüklerin, girintinin, aralığın ve satır kaydırmanın yeni satır yerleşimini denetleyebilirsiniz. Deyimleri ve blokları tamamladığınızda ve bir dosyaya kod yapıştırdığınızda kod otomatik olarak biçimlendirilir.

Ayraç Tamamlama. C++ kodu artık şu açılış karakterlerine karşılık gelen kapatma karakterlerini otomatik olarak tamamlar:

  • { (küme ayracı)
  • [(köşeli parantez)
  • ( (parantezler)
  • ' (tek tırnak)
  • "(çift tırnak)"

Ek C++ Otomatik Tamamlama Özellikleri.

  • Sınıf türleri için noktalı virgül ekler.
  • Ham dize değişmez değerleri için parantezleri tamamlar.
  • Çok satırlı açıklamaları tamamlar (/* */)

Tüm Başvuruları Bul artık metin eşleşmelerinin listesini görüntüledikten sonra referansları arka planda otomatik olarak çözümlüyor ve filtreliyor.

Context-Based Üye Listesi Filtreleme. Erişilemeyen üyeler, IntelliSense üye listelerinin dışında filtrelenir. Örneğin, türü uygulayan kodu değiştirmediğiniz sürece üye listesinde özel üyeler görüntülenmez. Üye listesi açıkken, bir filtre düzeyini kaldırmak için Ctrl+J tuşuna basabilirsiniz (yalnızca geçerli üye listesi penceresi için geçerlidir). Metin filtrelemesini kaldırmak ve her üyeyi göstermek için Ctrl+J tuşuna yeniden basabilirsiniz.

Parametre Kaydırma Yardımı. Parametre yardımı araç ipucunda görüntülenen işlev imzası artık yalnızca rastgele bir imza göstermek ve geçerli bağlama göre güncelleştirmek yerine gerçekten yazdığınız parametre sayısına göre değişir. Parametre yardımı, iç içe yerleştirilmiş işlevlerde görüntülendiğinde de düzgün çalışır.

Üst Bilgi/Kod Dosyası'nı değiştir. Artık kısayol menüsündeki bir komutu veya klavye kısayolunu kullanarak üst bilgi ile ilgili kod dosyası arasında geçiş yapabilirsiniz.

Yeniden Boyutlandırılabilir C++ Proje Özellikleri Penceresi

C++/CX ve C++/CLI'da Olay İşleyici Kodunun otomatik olarak oluşturulması. C++/CX veya C++/CLI kod dosyasına olay işleyicisi eklemek için kod yazarken, düzenleyici otomatik olarak temsilci örneği ve olay işleyicisi tanımı oluşturabilir. Etkinlik işleyici kodu otomatik olarak oluşturulabildiğinde bir araç ipucu penceresi görüntülenir.

DPI Farkındalığı Geliştirme. Uygulama manifest dosyaları için DPI bilinci ayarı artık "Her Monitörde Yüksek DPI Duyarlı" ayarını destekliyor.

Daha Hızlı Yapılandırma Geçişi. Büyük uygulamalar için, özellikle sonraki geçiş işlemleri olmak üzere yapılandırmalar arasında geçiş yapmak çok daha hızlı bir şekilde yürütülür.

İnşa Süresi Verimliliği. Çok sayıda iyileştirme ve çok çekirdekli kullanım, özellikle büyük projeler için derlemeleri daha hızlı hale getirir. C++ WinMD başvuruları olan C++ uygulamaları için artımlı derlemeler de çok daha hızlıdır.

Visual Studio 2012'deki C++ Yenilikler

Geliştirilmiş C++11 Standartları Desteği

Standart Şablon Kitaplığı

  • Yeni STL üst bilgileri desteği: <atomic>, <chrono>, <condition_variable>, <filesystem>, <future>, <mutex>, <ratio> ve <thread>.
  • Bellek kaynağı kullanımını iyileştirmek için kapsayıcılar artık daha küçüktür. Örneğin, varsayılan ayarlarla x86 sürüm modunda Visual std::vector Studio 2010'da 16 bayttan Visual Studio 2012'de 12 bayta kadar küçülmüştür ve std::map Visual Studio 2010'da 16 bayttan Visual Studio 2012'de 8 bayta kadar küçülmüştür.
  • C++11 Standardı'nın izin verdiği ancak gerektirmediği gibi, SCARY yineleyicileri uygulanmıştır.

Diğer C++11 Geliştirmeleri

  • Aralık tabanlı for döngüleri. Diziler, STL kapsayıcıları ve Windows Çalışma Zamanı koleksiyonlarıyla çalışacak daha sağlam döngüler yazmak için şu formu kullanabilirsiniz: for ( for-range-declaration : expression ). Bu, Çekirdek Dil desteğinin bir parçasıdır.

  • Boş bir lambda tanıtıcısı [] ile başlayan ve hiçbir yerel değişken yakalamayan kod blokları olan durum bilgisi olmayan lambdalar artık C++11 Standard'ın gerektirdiği şekilde işlev işaretçilerine örtük olarak dönüştürülebilir.

  • Tanımlı numaralandırmalar desteği. C++ enum sınıfı enum-key artık desteklenmektedir. Aşağıdaki kod, bu sabit listesi anahtarının önceki sabit listesi davranışından nasıl farklı olduğunu gösterir.

    enum class Element { Hydrogen, Helium, Lithium, Beryllium };
    void func1(Element e);
    func1(Hydrogen); // error C2065: 'Hydrogen' : undeclared identifier
    func1(Element::Helium); // OK
    

Windows Çalışma Zamanı Uygulaması Geliştirme Desteği

  • Yerel XAML tabanlı kullanıcı arabirimi modeli. Windows Çalışma Zamanı uygulamaları için yeni yerel XAML tabanlı kullanıcı arabirimi modelini kullanabilirsiniz.
  • Visual C++ Bileşen Uzantıları. Bu uzantılar, Windows Çalışma Zamanı uygulamalarının gerekli bir parçası olan Windows Çalışma Zamanı nesnelerinin tüketimini basitleştirir. Daha fazla bilgi için bkz. C++ kullanan Windows Çalışma Zamanı uygulamaları yol haritası ve Visual C++ dil başvurusu (C++/CX)
  • DirectX oyunları. Windows Çalışma Zamanı uygulamaları için yeni DirectX desteğini kullanarak ilgi çekici oyunlar geliştirebilirsiniz.
  • XAML/DirectX etkileşim. Hem XAML hem de DirectX kullanan Windows Çalışma Zamanı uygulamaları artık verimli bir şekilde birlikte çalışır.
  • Windows Çalışma Zamanı Bileşeni DLL geliştirme. Bileşen DLL'i geliştirme, Windows Çalışma Zamanı ortamını genişletilebilir hale getirir.

Derleyici ve Bağlayıcı

  • Otomatik vektörleştirici. Derleyici, kodunuzdaki döngüleri analiz eder ve mümkün olduğunda tüm modern işlemcilerde bulunan vektör yazmaçlarını ve talimatlarını kullanan komutlar oluşturur. Bu, döngülerin daha hızlı çalışmasını sağlar. (İşlemci yönergeleri, Akış SIMD Uzantıları için SSE olarak bilinir). Otomatik olarak uygulandığından bu iyileştirmeyi etkinleştirmeniz veya istemeniz gerekmez.
  • Otomatik paralelleştirici. Derleyici, kodunuzdaki döngüleri analiz edebilir ve hesaplamaları birden çok çekirdek veya işlemciye yayan yönergeler yayımlayabilir. Bu, döngülerin daha hızlı çalışmasını sağlayabilir. Varsayılan olarak etkinleştirilmediğinden bu iyileştirmeyi istemeniz gerekir. Çoğu durumda, paralel hale getirmek istediğiniz döngülerden hemen önce kodunuzda bir #pragma loop(hint_parallel(N)) eklemenize yardımcı olur.
  • Otomatik vektörleştirici ve otomatik paralelleştirici, hesaplamaların birden çok çekirdeğe yayılması ve her çekirdek üzerindeki kodun vektör yazmaçlarını kullanması için birlikte çalışabilir.

Visual Studio 2012 Güncelleştirme 1'deki yenilikler

C++ kodunuzu oluştururken Windows XP'yi hedefleyin. Windows XP ve Windows Server 2003'i hedeflemek için Microsoft C++ derleyicisini ve kitaplıklarını kullanabilirsiniz.

Paralel Programlama Desteği

C++ Hızlandırılmış Yüksek Paralellik (AMP)

C++ AMP, normalde ayrı bir grafik kartında GPU olarak bulunan veri paralel donanımından yararlanarak C++ kodunuzun yürütülmesini hızlandırır. C++ AMP programlama modeli çok boyutlu diziler, dizin oluşturma, bellek aktarımı, döşeme ve matematiksel işlev kitaplığı içerir. C++ AMP dil uzantılarını ve derleyici kısıtlamalarını kullanarak verilerin CPU'dan GPU'ya ve geriye nasıl taşındığını denetleyebilirsiniz.

Hata ayıklama. GPU'ya hedef olarak C++ AMP kullanan uygulamalar için hata ayıklama deneyimi, diğer C++ uygulamaları için hata ayıklamaya benzer. Bu, daha önce bahsedilen yeni paralel hata ayıklama eklemelerini içerir.

Profil oluşturma. Artık C++ AMP ve diğer Direct3D tabanlı programlama modellerini temel alan GPU etkinliği için profil oluşturma desteği vardır.

Genel Paralel Programlama Geliştirmeleri

Donanımlar çok çekirdekli ve çok çekirdekli mimarilere taşındığından, geliştiriciler artık tek çekirdekten sürekli artan saat hızlarına güvenemez. Eşzamanlılık Çalışma Zamanı'ndaki paralel programlama desteği, geliştiricilerin bu yeni mimarilerden yararlanmasını sağlar. Visual Studio 2010'da Paralel Desenler Kitaplığı gibi güçlü C++ paralelleştirme kitaplıkları, karmaşık veri akışı işlem hatlarını ifade ederek eşzamanlılık özelliğinden yararlanma özellikleriyle birlikte kullanıma sunulmuştur. Visual Studio 2012'de bu kitaplıklar geliştiricilerin en çok ihtiyaç duyduğu paralel desenler için daha iyi performans, daha fazla denetim ve daha zengin destek sağlayacak şekilde genişletilmiştir. Teklifin kapsamı artık şunları içerir:

  • Zaman uyumsuz ve devamlılıkları destekleyen zengin bir görev tabanlı programlama modeli.
  • Çatal birleştirme paralelliğini destekleyen Paralel Algoritmalar (parallel_for, benşimli parallel_for, parallel_for_each, parallel_sort, parallel_reduce, parallel_transform).
  • Eşzamanlılık açısından güvenli kapsayıcılar, priority_queue, kuyruk, vektörler ve harita gibi std veri yapılarının iş parçacığı açısından güvenli sürümlerini sağlar.
  • Geliştiricilerin doğal olarak eş zamanlı birimler halinde ayrıştırılan veri akışı işlem hatlarını ifade etmek için kullanabileceği Zaman Uyumsuz Aracılar Kitaplığı.
  • Bu listedeki desenlerin düzgün bir şekilde bileşimini kolaylaştırmak için özelleştirilebilir bir zamanlayıcı ve kaynak yöneticisi.
Genel Paralel Hata Ayıklama Geliştirmeleri

Paralel Görevler penceresine ve Paralel Yığınlar penceresine ek olarak, Visual Studio 2012 yeni bir Paralel İzleme penceresi sunar. Böylece tüm iş parçacıklarında ve işlemlerde bir ifadenin değerlerini inceleyebilir ve sonuçta sıralama ve filtreleme gerçekleştirebilirsiniz. Pencereyi genişletmek için kendi görselleştiricilerinizi de kullanabilir ve tüm araç pencerelerinde yeni çoklu işlem desteğinden yararlanabilirsiniz.

IDE

Visual Studio Şablonları desteği. Artık C++ proje ve öğe şablonları yazmak için Visual Studio Şablonları teknolojisini kullanabilirsiniz.

Asenkron Çözüm Yüklemesi. Projeler artık zaman uyumsuz olarak yükleniyor(önce çözümün temel parçaları), böylece daha hızlı çalışmaya başlayabilirsiniz.

Uzaktan hata ayıklama için otomatik dağıtım. Visual C++ uygulamasında uzaktan hata ayıklamaya yönelik dosyaların dağıtımı basitleştirildi. Proje bağlam menüsündeki Dağıt seçeneği, hata ayıklama yapılandırma özelliklerinde belirtilen dosyaları otomatik olarak uzak bilgisayara kopyalar. Dosyaları uzak bilgisayara el ile kopyalamak artık gerekli değildir.

C++/CLI IntelliSense. C++/CLI artık tam IntelliSense desteğine sahiptir. Hızlı Bilgi, Parametre Yardımı, Liste Üyeleri ve Otomatik Tamamlama gibi IntelliSense özellikleri artık C++/CLI için çalışıyor. Ayrıca, bu belgede listelenen diğer IntelliSense ve IDE geliştirmeleri de C++/CLI için çalışır.

Daha zengin IntelliSense Araç İpuçları. C++ IntelliSense Hızlı Bilgi araç ipuçları artık daha zengin XML belgeleri açıklama stili bilgilerini gösteriyor. Xml belge açıklamaları içeren bir kitaplıktan (örneğin, C++ AMP) bir API kullanıyorsanız IntelliSense araç ipucu yalnızca bildirimden daha fazla bilgi gösterir. Ayrıca, kodunuz XML belgeleri açıklamalarına sahipse IntelliSense araç ipuçları daha zengin bilgileri gösterir.

C++ Kod Yapıları. Liste Üyeleri açılan listesinde, switch, if-else yapıları, for döngüsü ve diğer temel kod yapıları için iskelet kodları mevcuttur. Kodunuza eklemek için listeden bir kod parçası seçin ve ardından gerekli mantığı doldurun. Düzenleyicide kullanmak üzere kendi özel kod parçalarınızı da oluşturabilirsiniz.

Liste Üyeleri Geliştirmeleri. Kod düzenleyicisine kod yazarken Liste Üyeleri açılan listesi otomatik olarak görüntülenir. Sonuçlar filtrelenir, böylece siz yazarken yalnızca ilgili üyeler görüntülenir. Üye Listesi tarafından kullanılan filtreleme mantığının türünü, Metin Düzenleyicisi>> altındaki Seçenekler iletişim kutusunda denetleyebilirsiniz.

Anlamsal Renklendirme. Türler, numaralandırmalar, makrolar ve diğer C++ belirteçleri artık varsayılan olarak renklendirmeye sahiptir.

Referans Vurgulama. Bir simge seçildiğinde artık geçerli dosyadaki simgenin tüm örnekleri vurgulanır. Vurgulanan başvurular arasında ilerlemek için Ctrl+Shift+Yukarı Ok veya Ctrl+Shift+Aşağı Ok tuşlarına basın. Bu özelliği Seçenekler iletişim kutusunda, Metin Düzenleyicisi>C/C++>Gelişmiş altında kapatabilirsiniz.

Uygulama Yaşam Döngüsü Yönetim Araçları

Statik Kod Analizi

C++ için statik analiz, daha zengin hata bağlamı bilgileri, daha fazla çözümleme kuralı ve daha iyi analiz sonuçları sağlayacak şekilde güncelleştirildi. Yeni Kod Analizi penceresinde iletileri anahtar sözcük, proje ve önem derecesine göre filtreleyebilirsiniz. Pencerede bir ileti seçtiğinizde, kod düzenleyicisinde iletinin tetiklendiği koddaki satır vurgulanır. Bazı C++ uyarıları için, ileti uyarıya yol açan yürütme yolunu gösteren kaynak satırları listeler; karar noktaları ve belirli bir yolu izleme nedenleri vurgulanır. Kod analizi, Visual Studio 2012'nin çoğu sürümünde yer alır. Professional, Premium ve Ultimate sürümlerinde tüm kurallar dahil edilir. Windows 8 ve Windows Phone için Express sürümlerinde yalnızca en kritik uyarılar bulunur. Kod analizi Web için Express sürümüne dahil değildir. Diğer kod analizi geliştirmeleri şunlardır:

  • Yeni eşzamanlılık uyarıları, çok iş parçacıklı C/C++ programlarında doğru kilitleme disiplinlerini kullandığınızdan emin olarak eşzamanlılık hatalarından kaçınmanıza yardımcı olur. Çözümleyici olası yarış koşullarını, kilit sırası ters çevrimlerini, çağıran/çağırılan kilitleme sözleşmesi ihlallerini, uyumsuz eşzamanlama işlemlerini ve diğer eşzamanlılık hatalarını algılar.
  • Kural kümelerini kullanarak kod çözümleme çalıştırmalarına uygulamak istediğiniz C++ kurallarını belirtebilirsiniz.
  • Kod Analizi penceresinde, kaynak koduna seçili uyarıyı gizleyen bir pragma ekleyebilirsiniz.
  • Bir işlevin parametrelerini nasıl kullandığını, bunlar hakkında yaptığı varsayımları ve tamamlandığında elde ettiği garantileri açıklamak için Microsoft kaynak kodu ek açıklama dilinin (SAL) yeni sürümünü kullanarak statik kod analizinin doğruluğunu ve eksiksizliğini geliştirebilirsiniz.
  • 64 bit C++ projeleri için destek.

Birim Test Çerçevesi güncelleştirildi

C++ birim testleri yazmak için Visual Studio'daki yeni C++ birim testi çerçevesini kullanın. Yeni Proje iletişim kutusundaki Visual C++ kategorisinin altında C++ Birim Testi Projesi şablonunu bularak mevcut C++ çözümünüz için yeni bir birim testi projesi ekleyin. Birim testlerinizi Unittest1.cpp dosyasında oluşturulan TEST_METHOD kod saplamasında yazmaya başlayın. Test kodu yazıldığında çözümü oluşturun. Testleri çalıştırmak istediğinizde, Görüntüle>>'ni seçerek bir Birim Test Gezgini penceresi açın ve istediğiniz test çalışmasının kısayol menüsünde Seçili testi çalıştır'ı seçin. Test çalıştırması tamamlandıktan sonra, test sonuçlarını ve ek yığın izleme bilgilerini aynı pencerede görüntüleyebilirsiniz.

Mimari Bağımlılık Grafikleri

Kodunuzu daha iyi anlamak için artık ikili, sınıf, ad alanı için bağımlılık grafikleri oluşturabilir ve dosyaları bir çözüme ekleyebilirsiniz. Menü çubuğunda Mimari>Bağımlılık Grafı Oluştur'u ve ardından Çözüm için veya Dosya Ekle'yi seçerek bir bağımlılık grafı oluşturun. Grafik oluşturma tamamlandığında, her düğümü genişleterek bunu keşfedebilir, düğümler arasında geçiş yaparak bağımlılık ilişkilerini öğrenebilir ve bir düğümün kısayol menüsünde İçeriği Görüntüle'yi seçerek kaynak koda göz atabilirsiniz. Ekleme dosyalarına yönelik bir bağımlılık grafiği oluşturmak için , *.cpp kaynak kod dosyasının veya *.h üst bilgi dosyasının kısayol menüsünde, Dosyaları ekle grafiği oluştur'u seçin.

Mimari Gezgini

Mimari Gezgini'ni kullanarak C++ çözümünüzdeki, projelerinizdeki veya dosyalarınızdaki varlıkları keşfedebilirsiniz. Menü çubuğunda Mimari>Windows>Mimari Gezgini'ni seçin. İlgilendiğiniz bir düğümü seçebilirsiniz; örneğin, Sınıf Görünümü. Bu durumda, araç penceresinin sağ tarafı bir ad alanı listesiyle genişletilir. Bir ad alanı seçerseniz, yeni bir sütun bu ad alanında sınıfların, yapıların ve sabit listelerinin listesini gösterir. Bu varlıkları keşfetmeye devam edebilir veya başka bir sorgu başlatmak için en soldaki sütuna geri dönebilirsiniz. Bkz. Mimari Gezgini ile Kod Bulma.

Kod Kapsamı

Kod kapsamı, çalışma zamanında ikili dosyaları dinamik olarak çalıştırmak üzere güncellendi. Bu, yapılandırma ek yükünü azaltır ve daha iyi performans sağlar. C++ uygulamaları için birim testlerinden kod kapsamı verileri de toplayabilirsiniz. C++ birim testleri oluşturduğunuzda, çözümünüzdeki testleri bulmak için Birim Test Gezgini'ni kullanabilirsiniz. Birim testlerini çalıştırmak ve bunlar için kod kapsamı verilerini toplamak için Birim Test Gezgini'ndeKod Kapsamını Analiz Et'i seçin. Kod kapsamı sonuçlarını Kod Kapsamı Sonuçları penceresinde inceleyebilirsiniz. Menü çubuğundaWindows>Kod Kapsamı Sonuçlarını> seçin.

Visual Studio 2010'da C++ için Yenilikler

C++ Derleyicisi ve Bağlayıcısı

auto Anahtar Sözcüğü. Anahtar sözcüğün auto yeni bir amacı vardır. Türü değişkenin bildirimindeki auto başlatma ifadesinden çıkarılmış bir değişken bildirmek için anahtar sözcüğün varsayılan anlamını kullanın. Derleyici /Zc:auto seçeneği, anahtar sözcüğün yeni veya önceki anlamını auto çağırır.

decltype Tür Tanımlayıcısı. Tür tanımlayıcısı decltype , belirtilen ifadenin türünü döndürür. decltype Karmaşık veya yalnızca derleyici tarafından bilinen bir tür bildirmek için tür tanımlayıcısını auto anahtar sözcüğüyle birlikte kullanın. Örneğin, dönüş türü şablon bağımsız değişkenlerinin türlerine bağlı olan bir şablon işlevi bildirmek için kombinasyonunu kullanın. Alternatif olarak, başka bir işlevi çağıran bir şablon işlevi bildirin ve sonra, çağrılan işlevin dönüş türünü döndüren bu şablon işlevi tanımlayın.

Lambda İfadeleri. Lambda işlevlerinin bir işlev gövdesi vardır ancak adı yoktur. Lambda işlevleri, işlev işaretçilerinin ve işlev nesnelerinin en iyi özelliklerini birleştirir. Lambda işlevini tek başına, işlev nesnesi yerine şablon işlev parametresi olarak veya türü lambda olan bir değişkeni bildirmek için anahtar sözcüğüyle auto birlikte kullanın.

Rvalue Referansı. rvalue referans bildirimi (&&) bir rvalue'a referans bildirir. Rvalue başvurusu, daha verimli oluşturucular, işlevler ve şablonlar yazmak için taşıma semantiğini ve mükemmel iletmeyi kullanmanıza olanak tanır.

static_assert Bildirimi. Bir static_assert bildirimi, diğer onaylama mekanizmalarının çalışma zamanında test ettiği durumların aksine, derleme zamanında bir yazılım onaylama işlemini test eder. Onaylama işlemi başarısız olursa, derleme başarısız olur ve belirtilen bir hata iletisi verilir.

nullptr ve __nullptr Anahtar Sözcükleri. MSVC, anahtar sözcüğünü nullptr yerel kodla veya yönetilen kodla kullanmanıza olanak tanır. nullptr anahtar sözcüğü nesne tanıtıcısının, iç işaretçinin veya yerel işaretçi türünün bir nesneyi işaret etmediğini gösterir. Derleyici, nullptr derleyici seçeneğini kullandığınızda /clr'yi yönetilen kod, /clr seçeneğini kullanmadığınızda ise yerel kod olarak yorumlar. Microsoft'a özgü __nullptr anahtar sözcüğü ile aynı anlama nullptrsahiptir, ancak yalnızca yerel kod için geçerlidir. Derleyici seçeneğini kullanarak /clr yerel C/C++ kodu derlerseniz, derleyici anahtar sözcüğün nullptr yerel mi yoksa yönetilen bir terim mi olduğunu belirleyemez. Amacınızı derleyiciye açıkça belirtmek için nullptr anahtar sözcüğünü kullanarak yönetilen terimi belirtin ve yerel terimi belirtmek için __nullptr .

/Zc:trigraphs Derleyici Seçeneği. Varsayılan olarak, 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ını '#' (sayı işareti) karakteriyle değiştirir. C kaynak dosyalarında belirli noktalama işaretleri içermeyen bir karakter kümesi kullanan trigrafları kullanın.

Yeni Profile-Guided İyileştirme Seçeneği. PogoSafeMode, uygulamanızı iyileştirirken güvenli modu mu yoksa hızlı modu mu kullanacağınızı belirtmenize olanak tanıyan yeni bir profil destekli iyileştirme seçeneğidir. Güvenli mod iş parçacığı açısından güvenlidir, ancak hızlı moddan daha yavaştır. Hızlı mod varsayılan davranıştır.

Yeni Ortak Dil Çalışma Zamanı (CLR) Seçeneği /clr:nostdlib. (Ortak Dil Çalışma Zamanı Derlemesi) için /clr yeni bir seçenek eklendi. Aynı kitaplıkların farklı sürümleri dahil edilirse bir derleme hatası verilir. Yeni seçenek, programınızın belirtilen sürümü kullanabilmesi için varsayılan CLR kitaplıklarını dışlamanıza olanak tanır.

Yeni pragma yönergesi 'detect_mismatch'. pragma yönergesi detect_mismatch, dosyalarınıza aynı ada sahip diğer etiketlerle karşılaştırılan bir etiket yerleştirmenize olanak tanır. Aynı ad için birden çok değer varsa, bağlayıcı bir hata verir.

XOP Intrinsics, FMA4 Intrinsics ve LWP Intrinsics. Visual Studio 2010 SP1 için XOP İç Özellikleri Eklendi, Visual Studio 2010 SP1 için FMA4 İç Özellikleri Eklendi ve Visual Studio 2010 SP1 işlemci teknolojileri için LWP İç Özellikleri Eklendi'yi desteklemek için yeni iç işlevler eklendi. Belirli bir bilgisayarda hangi işlemci teknolojilerinin destekleneceğini belirlemek için __cpuid __cpuidex kullanın.

Visual Studio C++ projeleri ve Derleme Sistemi

MSBuild. Visual C++ çözümleri ve projeleri artık VCBuild.exeyerine MSBuild.exekullanılarak oluşturulur. MSBuild, diğer Visual Studio dilleri ve proje türleri tarafından kullanılan esnek, genişletilebilir, XML tabanlı derleme aracıyla aynıdır. Bu değişiklik nedeniyle Visual Studio C++ proje dosyaları artık bir XML dosya biçimi kullanıyor ve .vcxproj dosya adı uzantısına sahip. Visual Studio'nun önceki sürümlerindeki Visual Studio C++ proje dosyaları otomatik olarak yeni dosya biçimine dönüştürülür.

VC++ Dizinleri. VC++ dizinleri ayarı artık iki yerde bulunur. VC++ dizinleri için proje başına değerleri ayarlamak için proje özellik sayfalarını kullanın. VC++ dizinleri için genel, yapılandırma başına değerleri ayarlamak için Özellik Yöneticisi'ni ve özellik sayfasını kullanın.

Projeden Projeye Bağımlılıklar. Önceki sürümlerde projeler arasındaki tanımlı bağımlılıklar çözüm dosyasında depolanıyordu. Bu çözümler yeni proje dosyası biçimine dönüştürüldüğünde bağımlılıklar projeden projeye başvurulara dönüştürülür. Çözüm bağımlılıkları ve projeden projeye başvuru kavramları farklı olduğundan bu değişiklik uygulamaları etkileyebilir.

Makrolar ve Ortam Değişkenleri. Yeni _ITERATOR_DEBUG_LEVEL makrosu, yineleyiciler için hata ayıklama desteğini çağırır. Bu makroyu, eski _SECURE_SCL ve _HAS_ITERATOR_DEBUGGING makroları yerine kullanın.

Visual C++ Kitaplıkları

Eşzamanlılık Çalışma Zamanı Kitaplıkları. Eşzamanlılık Çalışma Zamanı çerçevesi, aynı anda çalışan uygulamaları ve bileşenleri destekler ve Visual C++'da eşzamanlı uygulamaları programlamaya yönelik bir çerçevedir. Paralel Desenler Kitaplığı (PPL), eşzamanlı uygulama programlamayı desteklemek için ayrıntılı paralellik gerçekleştirmeye yönelik genel amaçlı kapsayıcılar ve algoritmalar sağlar. Asenkron Ajanlar Kütüphanesi, geniş kapsamlı veri akışı ve ardışık düzenleme görevleri için aktör tabanlı bir programlama modeli ve iletişim arabirimleri sağlar.

Standart C++ Kitaplığı. Aşağıdaki listede, Standart C++ Kitaplığı'na yapılan değişikliklerin çoğu açıklanmaktadır.

  • Yeni r-değer referansı C++ dil özelliği, Standart Şablon Kütüphanesi'ndeki birçok işlev için taşıma semantiği ve mükemmel yönlendirme uygulamak için kullanılmıştır. Semantiği taşıma ve mükemmel iletme, değişkenleri veya parametreleri ayıran veya atayan işlemlerin performansını büyük ölçüde artırır.
  • Rvalue başvuruları, unique_ptr sınıfından daha güvenli bir akıllı işaretçi türü olan yeni auto_ptr sınıfını uygulamak için de kullanılır. unique_ptr Sınıfı taşınabilir ancak kopyalanamaz, güvenliği etkilemeden katı sahiplik semantiği uygular ve rvalue başvurularının farkında olan kapsayıcılarla iyi çalışır. auto_ptr sınıfı kullanım dışıdır.
  • On beş yeni işlev, örneğin find_if_not, copy_if ve is_sorted, <algoritma> üst bilgisine eklendi.
  • Bellek< üst bilgisinde >yeni make_shared işlevi, nesne oluşturulurken aynı anda bir nesne için paylaşılan işaretçi oluşturmanın kullanışlı, sağlam ve verimli bir yoludur.
  • Tek bağlantılı listeler <forward_list> üst bilgisi tarafından desteklenir.
  • Yeni cbegin, cend, crbegin ve crend üye işlevleri, kapsayıcı const_iterator boyunca ileri veya geri hareket etmeyi sağlayan bir işlevsunmaktadır.
  • <system_error> üst bilgisi ve ilgili şablonlar, düşük düzeyli sistem hatalarının işlenmesini destekler. Sınıfın exception_ptr üyeleri iş parçacıkları arasında özel durumları taşımak için kullanılabilir.
  • <codecvt> üst bilgisi, Unicode karakterlerin çeşitli kodlamalarını diğer kodlamalara dönüştürmeyi destekler.
  • <Ayırıcılar üst bilgisi, düğüm tabanlı kapsayıcılar için bellek blokları> ayırmaya ve boşaltmaya yardımcı olan çeşitli şablonları tanımlar.
  • Rastgele üst bilgideki <çok sayıda güncelleştirme vardır>.

Microsoft Foundation Class (MFC) Kitaplığı

Windows 7 Özellikleri. MFC, Şerit kullanıcı arabirimi (UI), Görev Çubuğu, atlama listeleri, sekmeli küçük resimler, küçük resim önizlemeleri, ilerleme çubuğu, simge katmanı ve arama dizini oluşturma gibi birçok Windows 7 özelliğini destekler. MFC birçok Windows 7 özelliğini otomatik olarak desteklediği için mevcut uygulamanızı değiştirmeniz gerekmeyebilir. Yeni uygulamalarda diğer özellikleri desteklemek için, MFC Uygulama Sihirbazı'nı kullanarak kullanmak istediğiniz işlevselliği belirtin.

Çoklu dokunma desteği. MFC, microsoft Surface işletim sistemi için yazılmış uygulamalar gibi çok dokunmatik kullanıcı arabirimine sahip uygulamaları destekler. Çok dokunmalı bir uygulama, dokunmatik iletilerin birleşimi olan Windows dokunma iletilerini ve hareket iletilerini işleyebilir. Uygulamanızı dokunma ve hareket olayları için kaydetmeniz yeter. İşletim sistemi çok dokunmalı olayları olay işleyicilerinize yönlendirir.

High-DPI Farkındalık. Varsayılan olarak, MFC uygulamaları artık Yüksek DPI kullanan uygulamalardır. Bir uygulama High-DPI (inç başına yüksek nokta) algılarsa, işletim sistemi pencereleri, metinleri ve diğer kullanıcı arabirimi öğelerini geçerli ekran çözünürlüğüne ölçeklendirebilir. Bu, ölçeklendirilmiş görüntünün doğru şekilde yerleştirilme olasılığının daha yüksek olduğu ve kırpılma veya piksellendirilmeme olasılığının daha yüksek olduğu anlamına gelir.

Yeniden Başlatma Yöneticisi. Yeniden başlatma yöneticisi belgeleri otomatik olarak kaydeder ve beklenmedik şekilde kapanırsa veya yeniden başlatılırsa uygulamanızı yeniden başlatır. Örneğin, uygulamanızı otomatik güncelleştirmeyle kapattıktan sonra başlatmak için yeniden başlatma yöneticisini kullanabilirsiniz. Uygulamanızı yeniden başlatma yöneticisini kullanacak şekilde yapılandırma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Yeniden Başlatma Yöneticisi Desteği Ekleme.

CTaskDialog. sınıfı CTaskDialog standart AfxMessageBox ileti kutusu yerine kullanılabilir. sınıfı, CTaskDialog standart ileti kutusundan daha fazla bilgi görüntüler ve toplar.

SafeInt Kitaplığı

Yeni SafeInt Kitaplığı, tamsayı taşmasını hesaplayan güvenli aritmetik işlemler gerçekleştirir. Bu kitaplık ayrıca farklı tamsayı türlerini karşılaştırır.

Yeni Etkin Şablon Kitaplığı (ATL) makroları

PROP_ENTRY_TYPE ve PROP_ENTRY_TYPE_EX işlevselliğini genişletmek için ATL'ye yeni makrolar eklendi. PROP_ENTRY_INTERFACE ve PROP_ENTRY_INTERFACE_EX, geçerli CLSID'lerin listesini eklemenize olanak sağlar. PROP_ENTRY_INTERFACE_CALLBACK ve PROP_ENTRY_INTERFACE_CALLBACK_EX, CLSID'nin geçerli olup olmadığını belirlemek için bir geri çağırma işlevi belirtmenize olanak tanır.

/analiz Et Uyarıları

Çoğu /analyze (Kurumsal Kod Analizi) uyarısı C Run-Time (CRT), MFC ve ATL kitaplıklarından kaldırılmıştır.

Animasyon ve D2D desteği

MFC artık animasyon ve Direct2D grafiklerini destekliyor. MFC kitaplığında bu işlevselliği desteklemek için birkaç yeni MFC sınıfı ve işlevi vardır. Ayrıca bir D2D nesnesinin ve animasyon nesnesinin projeye nasıl ekleneceğini gösteren iki yeni izlenecek yol vardır. Bu kılavuzlar Kılavuz: MFC Projesine D2D Nesnesi Ekleme ve Kılavuz: MFC Projesine Animasyon Ekleme.

IDE

Geliştirilmiş IntelliSense. Visual C++ için IntelliSense daha hızlı, daha doğru ve daha büyük projeleri işleyebilecek şekilde tamamen yeniden tasarlanmıştır. Bu iyileştirmeyi elde etmek için IDE, geliştiricinin kaynak kodu görüntüleme ve değiştirme şekli ile IDE'nin çözüm oluşturmak için kaynak kodu ve proje ayarlarını nasıl kullandığı arasında ayrım yapar. Bu görev ayrımı nedeniyle, Sınıf Görünümü ve yeni Git iletişim kutusu gibi gözatma özellikleri, eski derleme yok gözatma (.ncb) dosyasının yerini alan yeni bir SQL Server masaüstü veritabanı (.sdf) dosyasını temel alan bir sistem tarafından işlenir. Hızlı Bilgi, Otomatik Tamamlama ve Parametre Yardımı gibi IntelliSense özellikleri yalnızca gerektiğinde çeviri birimlerini ayrıştırma. Yeni Arama Hiyerarşisi penceresi gibi karma özellikler, göz atma ve IntelliSense özelliklerinin bir bileşimini kullanır. IntelliSense yalnızca şu anda ihtiyacınız olan bilgileri işlediğinden IDE daha hızlı yanıt verir. Ayrıca, bilgiler daha güncel olduğundan IDE görünümleri ve pencereleri daha doğru olur. Son olarak, IDE altyapısı daha iyi düzenlendiğinden, daha yetenekli ve daha ölçeklenebilir olduğundan, daha büyük projeleri işleyebilir.

Geliştirilmiş IntelliSense Hataları. IDE, IntelliSense kaybına neden olabilecek hataları daha iyi algılar ve bunların altında kırmızı dalgalı alt çizgiler görüntüler. Ayrıca IDE, IntelliSense hatalarını Hata Listesi Penceresi'ne bildirir. Soruna neden olan kodu görüntülemek için Hata Listesi Penceresinde hataya çift tıklayın.

Otomatik Tamamlama Özelliğini #include. IDE, anahtar sözcük için otomatik tamamlamayı #include destekler. yazdığınızda #include, IDE geçerli üst bilgi dosyalarının yer aldığı bir açılan liste kutusu oluşturur. Bir dosya adı yazarak devam ederseniz, IDE girdinize göre listeyi filtreler. Herhangi bir noktada, listeden eklemek istediğiniz dosyayı seçebilirsiniz. Bu, tam dosya adını bilmeden dosyaları hızla eklemenize olanak tanır.

Adresine gidin. Git iletişim kutusu, projenizde belirtilen dizeyle eşleşen tüm sembolleri ve dosyaları aramanızı sağlar. Arama dizenize ek karakterler yazarken arama sonuçları hemen düzeltilir. Sonuçlar geri bildirim alanı, bulunan öğe sayısını bildirir ve aramanızı kısıtlayıp kısıtlamayacağınız konusunda karar vermenize yardımcı olur. Tür/Kapsam, Konum ve Önizleme geri bildirim alanları, benzer adlara sahip öğeleri belirsizleştirmenize yardımcı olur. Ayrıca, bu özelliği diğer programlama dillerini destekleyecek şekilde genişletebilirsiniz.

Paralel Hata Ayıklama ve Profil Oluşturma. Visual Studio hata ayıklayıcısı Eşzamanlılık Çalışma Zamanı'nın farkındadır ve paralel işleme uygulamalarında sorun gidermenize yardımcı olur. Uygulamanızın genel davranışını görselleştirmek için yeni eşzamanlılık profil oluşturucu aracını kullanabilirsiniz. Ayrıca, görevlerin durumunu ve bunların çağrı yığınlarını görselleştirmek için yeni araç pencerelerini kullanabilirsiniz.

Şerit Tasarımcısı. Şerit Tasarımcısı, MFC şerit kullanıcı arabirimi oluşturmanızı ve değiştirmenizi sağlayan bir grafik düzenleyicidir. Son şerit kullanıcı arabirimi XML tabanlı bir kaynak dosyası (.mfcribbon-ms) ile temsil edilir. Mevcut uygulamalar için, geçici olarak birkaç kod satırı ekleyip Şerit Tasarımcısı'nı çağırarak geçerli şerit kullanıcı arabiriminizi yakalayabilirsiniz. Şerit kaynak dosyası oluşturulduktan sonra, el yazısı şerit kullanıcı arabirimi kodunuzu şerit kaynağını yükleyen birkaç satır kod ile değiştirebilirsiniz.

Hiyerarşiyi çağır. Çağrı Hiyerarşisi penceresi, belirli bir işlev tarafından çağrılan tüm işlevlere veya belirli bir işlevi çağıran tüm işlevlere gitmenizi sağlar.

Araçlar

MFC Sınıf Sihirbazı. Visual C++ 2010, iyi kabul gören MFC Sınıf Sihirbazı aracını geri getirir. MFC Sınıf Sihirbazı, kaynak dosya kümelerini el ile değiştirmek zorunda kalmadan bir projeye sınıf, ileti ve değişken eklemenin kullanışlı bir yoludur.

ATL Denetim Sihirbazı. ATL Denetim Sihirbazı artık alanı otomatik olarak doldurmaz ProgID . Eğer bir ATL denetimi ProgID içermiyorsa, diğer araçlar onunla çalışmayabilir. Denetimlerin etkin olması gereken bir araç örneği ProgID iletişim kutusudur. İletişim kutusu hakkında daha fazla bilgi için bkz. ActiveX denetimleri ekleme.

Microsoft Macro Assembler Başvurusu

Intel Advanced Vector Extensions (AVX) yönergelerinde yer alan 256 bitlik multimedya işlenenlerini destekleyen YMMWORD veri türü eklendi.

Visual Studio 2008'de C++ için Yenilikler

Visual C++ Tümleşik Geliştirme Ortamı (IDE)

  • ATL, MFC ve Win32 uygulamalarında oluşturulan iletişim kutuları artık Windows Vista stil yönergelerine uygundur. Visual Studio 2008 kullanarak yeni bir proje oluşturduğunuzda, uygulamanıza eklediğiniz tüm iletişim kutuları Windows Vista stil kılavuzuna uyar. Visual Studio'nun önceki bir sürümüyle oluşturduğunuz bir projeyi yeniden derlerseniz, var olan tüm iletişim kutuları daha önce sahip oldukları görünümü korur. Uygulamanıza iletişim kutuları ekleme hakkında daha fazla bilgi için bkz. İletişim Kutusu Düzenleyicisi.

  • ATL Projesi sihirbazı artık tüm kullanıcılar için bileşenleri kaydetme seçeneğine sahiptir. Visual Studio 2008'de başlayarak, TÜM kullanıcılar için bileşeni kaydet'i seçmediğiniz sürece, ATL Projesi sihirbazı tarafından oluşturulan COM bileşenleri ve tür kitaplıkları kayıt defterinin HKEY_CURRENT_USER düğümüne kaydedilir.

  • ATL Projesi sihirbazı artık öznitelikli ATL projeleri oluşturma seçeneği sağlamaz. Visual Studio 2008'le başlayarak , ATL Projesi sihirbazının yeni bir projenin öznitelikli durumunu değiştirme seçeneği yoktur. Sihirbazın oluşturduğu tüm yeni ATL projeleri artık dağıtılmaz.

  • Kayıt defterine yazma yeniden yönlendirilebilir. Windows Vista'nın kullanıma sunulmasıyla birlikte, kayıt defterinin belirli alanlarına yazmak için bir programın yükseltilmiş modda çalıştırılması gerekir. Visual Studio'yu her zaman yükseltilmiş modda çalıştırmak istenmez. Kullanıcı başına yeniden yönlendirme, HKEY_CLASSES_ROOT kayıt defteri yazmalarını herhangi bir programlama değişikliği gerektirmeden otomatik olarak HKEY_CURRENT_USER'a yeniden yönlendirir.

  • Sınıf Tasarımcısı artık yerel C++ kodu için sınırlı desteğe sahiptir. Visual Studio'nun önceki sürümlerinde Sınıf Tasarımcısı yalnızca Visual C# ve Visual Basic ile çalışıyordu. C++ kullanıcıları artık Sınıf Tasarımcısı'nı yalnızca salt okunur modda kullanabilir. C++ ile Sınıf Tasarımcısı'nı kullanma hakkında daha fazla bilgi için bkz. Sınıf Tasarımcısı'nda Visual C++ Koduyla Çalışma.

  • Proje sihirbazının artık C++ SQL Server projesi oluşturma seçeneği yoktur. 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.

Visual C++ Kitaplıkları

Genel

  • Uygulamalar Visual C++ kitaplıklarının belirli sürümlerine bağlanabilir. Bazen bir uygulama, bir sürümden sonra Visual C++ kitaplıklarında yapılan güncelleştirmelere bağlıdır. Bu durumda, uygulamayı kitaplıkların önceki sürümlerine sahip bir bilgisayarda çalıştırmak beklenmeyen davranışlara neden olabilir. Artık bir uygulamayı kitaplıkların daha önceki bir sürümüne sahip bir bilgisayarda çalıştırılmaması için kitaplıkların belirli bir sürümüne bağlayabilirsiniz.

STL/CLR Kitaplığı

  • Visual C++ artık STL/CLR Kitaplığı'nı içerir. STL/CLR Kitaplığı, C++ ve .NET Framework ortak dil çalışma zamanı (CLR) ile kullanılmak üzere Standart C++ Kitaplığı'nın bir alt kümesi olan Standart Şablon Kitaplığı'nın (STL) bir paketidir. STL/CLR ile artık yönetilen bir ortamda STL'nin tüm kapsayıcılarını, yineleyicilerini ve algoritmalarını kullanabilirsiniz.

MFC Kitaplığı

  • Windows Vista Ortak Kontrolleri destekler. Windows Vista'daki özellikleri desteklemek veya geçerli MFC sınıflarındaki işlevselliği geliştirmek için 18 yeni veya mevcut sınıfta 150'den fazla yöntem eklenmiştir.
  • Yeni CNetAddressCtrl sınıf, IPv4 ve IPv6 adreslerini veya DNS adlarını girmenizi ve doğrulamanızı sağlar.
  • Yeni CPagerCtrl sınıf, Windows çağrı cihazı denetiminin kullanımını basitleştirir.
  • Yeni CSplitButton sınıf, varsayılan veya isteğe bağlı bir eylem seçmek için Windows bölünmüş düğme denetiminin kullanımını basitleştirir.

C++ Destek Kitaplığı

  • C++ marşaling kitaplığını tanıtır. Hazırlama kitaplığı, yerel ve yönetilen ortamlar arasında verileri sıralamak için kolay ve iyileştirilmiş bir yol sağlar. Kitaplık, PInvoke Kullanma gibi daha karmaşık ve daha az verimli yaklaşımlara alternatiftir. Daha fazla bilgi için C++ dilinde Yönlendirmeye Genel Bakış'a bakın.

ATL Sunucusu

  • ATL Sunucusu paylaşılan kaynak proje olarak yayınlanır.
  • ATL Sunucusu kod tabanının çoğu CodePlex'te paylaşılan kaynak projesi olarak yayımlanmıştır ve Visual Studio 2008'in bir parçası olarak yüklenmemiştir. ATL Sunucusu ile ilişkilendirilmiş birkaç dosya artık Visual Studio'nun parçası değildir. Kaldırılan dosyaların listesi için bkz. ATL Sunucu Dosyaları Kaldırıldı.
  • 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ı artık ATL kitaplığının bir parçasıdır.
  • Microsoft, Visual Studio'nun önceki sürümlerinde yer alan ATL Server sürümlerini, Visual Studio'nun bu sürümleri desteklendiği sürece desteklemeye devam edecektir. CodePlex, ATL Sunucu kodunun bir topluluk projesi olarak geliştirilmesine devam edecektir. Microsoft, ATL Server'ın CodePlex sürümünü desteklemez.

Visual C++ Derleyicisi ve Bağlayıcısı

Derleyici Değişiklikleri

  • Derleyici, kontrollü artımlı derlemeleri destekler. Bu seçeneği belirttiğinizde, başvuruda bulunılan bir derleme değiştiğinde derleyici kodu yeniden derlemez. Bunun yerine artımlı derleme gerçekleştirir. Dosyalar yalnızca değişiklikler bağımlı kodu etkilerse yeniden derlenir.
  • ATL Sunucusu ile ilgili öznitelikler artık desteklenmiyor. Derleyici artık ATL Sunucusu ile doğrudan ilişkili olan çeşitli öznitelikleri desteklememektedir. Kaldırılan özniteliklerin tam listesi için bkz. Yıkıcı Değişiklikler.
  • Derleyici, Intel Core mikro mimarisini destekler. Derleyici, kod oluşturma sırasında Intel Core mikro mimarisi için ayarlama içerir. Varsayılan olarak, bu ayar açıktır ve Pentium 4 ve diğer işlemcilere de yardımcı olduğundan devre dışı bırakılamaz.
  • İç bilgiler daha yeni AMD ve Intel işlemcileri destekler. Bazı yeni iç yönergeler, daha yeni AMD ve Intel işlemcilerde daha fazla işlevselliği destekler. Yeni intrinsikler hakkında daha fazla bilgi için bkz. Ek Akış SIMD Uzantıları 3 Yönergeleri, Akış SIMD Uzantıları 4 Yönergeleri, SSE4A ve Gelişmiş Bit Manipülasyon Intrinsikleri, AES Intrinsikleri, _mm_clmulepi64_si128 ve __rdtscp.
  • __cpuid işlevi güncellendi. __cpuid, __cpuidex işlevleri artık AMD ve Intel işlemcilerin en son düzeltmelerinden birkaç yeni özelliği desteklemektedir. Yeni __cpuidex özelliği, son işlemcilerden daha fazla bilgi toplar.
  • Derleyici /MP seçeneği toplam derleme süresini azaltır. seçeneği, /MP dosyaları aynı anda derleyen çeşitli işlemler oluşturarak çeşitli kaynak dosyaları derlemek için toplam süreyi önemli ölçüde azaltabilir. Bu seçenek özellikle hiper iş parçacığı kullanımı, birden çok işlemci veya birden çok çekirdeği destekleyen bilgisayarlarda kullanışlıdır.
  • /Wp64 Derleyici seçeneği ve __w64 anahtar sözcüğü kullanım dışıdır. /Wp64 64 bit taşınabilirlik sorunlarını algılayan derleyici seçeneği ve __w64 anahtar sözcüğü kullanım dışıdır ve derleyicinin gelecekteki bir sürümünde kaldırılacaktır. Bu derleyici seçeneği ve anahtar sözcüğü yerine, 64 bit platformu hedefleyen bir MSVC kullanın.
  • /Qfast_transcendentals , transandantal işlevler için satır içi kod oluşturur.
  • /Qimprecise_fwaits derleyici seçeneğini kullandığınızda blokları denemek için iç fwait komutlarını /fp:except kaldırır.

Bağlayıcı Değişiklikleri

  • Kullanıcı Hesabı Denetimi bilgileri artık Visual C++ bağlayıcısı (link.exe) tarafından yürütülebilir dosyalar için bildirim dosyalarına ekleniyor. Bu özellik varsayılan olarak etkindir. Bu özelliği devre dışı bırakma veya varsayılan davranışı değiştirme hakkında daha fazla bilgi için bkz /MANIFESTUAC . (Bildirime UAC bilgilerini ekler).
  • Bağlayıcı artık Windows Vista'nın /DYNAMICBASE Adres Alanı Düzeni Rastgele Seçim özelliğini etkinleştirme seçeneğine sahiptir. Bu seçenek, uygulamanın yükleme sırasında rastgele yeniden temellendirilip temellendirilmeyeceğini belirtmek için yürütülebilir dosyanın üst bilgisini değiştirir.

Visual Studio 2005'teki C++'daki Yenilikler

Visual C++ 2005 Service Pack 1'deki yeni özellikler şunlardır:

x86 ve x64 iç bilgileri

  • __durmak
  • __lidt
  • __Nop
  • __readcr8
  • __sidt
  • __svm_clgi
  • __svm_invlpga
  • __svm_skinit
  • __svm_stgi
  • __svm_vmload
  • __svm_vmrun
  • __svm_vmsave
  • __ud2
  • __vmx_off
  • __vmx_vmptrst
  • __writecr8

Yalnızca x64 için iç bilgi

  • __vmx_on
  • __vmx_vmclear
  • __vmx_vmlaunch
  • __vmx_vmptrld
  • __vmx_vmread
  • __vmx_vmresume
  • __vmx_vmwrite

Yeni Dil Anahtar Sözcükleri

__sptr, __uptr

Yeni Derleyici Özellikleri

Derleyici bu sürümde hataya neden olan değişiklikler içeriyor.

  • 64 bit yerel ve çapraz derleyiciler.
  • /analyze (Kurumsal Kod Analizi) derleyici seçeneği eklendi.
  • /bigobj derleyici seçeneği eklendi.
  • /clr:pure, /clr:safeve /clr:oldSyntax eklendi. (Daha sonra Visual Studio 2015'te kullanım dışı bırakıldı ve Visual Studio 2017'de kaldırıldı.)
  • Kullanım dışı bırakılan derleyici seçenekleri: Bu sürümde birçok derleyici seçeneği kullanım dışı bırakılmıştır; Daha fazla bilgi için bkz. Kullanım Dışı Derleyici Seçenekleri .
  • Koddaki çifte thunking azaltıldı; daha fazla bilgi için bkz. /clr
  • /EH (Özel Durum İşleme Modeli) veya /EHs artık "throw" dışında bir yöntemle tetiklenen bir özel durumu yakalamak için kullanılamaz; /EHa kullanın.
  • /errorReport (İç Derleyici Hatalarını Bildir) derleyici seçeneği eklendi.
  • /favor (64 için en iyi duruma getir) derleyici seçeneği eklendi.
  • /FA, /Fa (Listeleme Dosyası) derleyici seçeneği eklendi.
  • /FC (Tanılamada Kaynak Kod Dosyasının Tam Yolu) derleyici seçeneği eklendi.
  • /fp (Floating-Point Davranışı Belirt) derleyici seçeneği eklendi.
  • /G (İşlemci için en iyi duruma getir) Seçenekler derleyici seçeneği eklendi.
  • /G (İşlemci için en iyi duruma getir) Seçenekler derleyici seçeneği eklendi.
  • /G3, /G4, /G5, /G6, , /G7ve /GB derleyici seçenekleri kaldırıldı. Derleyici artık tüm mimariler için en iyi çıkış dosyasını oluşturmaya çalışan bir "karma model" kullanıyor.
  • /Gf kaldırıldı. Bunun yerine (Yinelenen Dizeleri Ortadan Kaldır) kullanın /GF .
  • /GL (Tüm Program İyileştirme) artık ile /CLRHEADERuyumludur.
  • /GR artık varsayılan olarak açıktır.
  • /GS (Arabellek Güvenlik Denetimi) artık güvenlik açığı olan işaretçi parametreleri için güvenlik koruması sağlar. /GS artık varsayılan olarak açıktır. /GS şimdi (Ortak Dil Çalışma Zamanı Derlemesi) ile /clr MSIL'e derlenen işlevler üzerinde de çalışır.
  • /homeparams (Yazmaç Parametrelerini Yığına Kopyala) derleyici seçeneği eklendi.
  • /hotpatch (Sıcak Yama Olabilir Görüntü Oluştur) derleyici seçeneği eklendi.
  • Satır içi işlev buluşsal yöntemleri güncelleştirildi; daha fazla bilgi için bkz. inline, __inline, __forceinline ve inline_depth
  • Birçok yeni iç işlev eklenmiştir ve daha önce belgelenmemiş birçok iç işlev artık belgelenmiştir.
  • Varsayılan olarak, başarısız olan her bir new çağrısı bir istisna fırlatır.
  • /ML ve /MLd derleyici seçenekleri kaldırıldı. Visual C++ artık tek iş parçacıklı, statik olarak bağlı CRT kitaplığı desteğini sunmuyor.
  • Derleyici, /O1, /O2 (Boyutu Küçült, Hızı En Üst Düzeye Çıkar), /Og (Genel Optimizasyonlar) ve /Ox (Tam Optimizasyon) ile derlediğinizde etkinleştirilen Adlandırılmış Dönüş Değeri Optimizasyonunu uyguladı.
  • /Oa derleyici seçeneği kaldırıldı, ancak herhangi bir uyarı vermeden yoksayılacak; derleyicinin aliasing yapmayı nasıl gerçekleştirdiğini belirtmek için noalias ve restrict__declspec değiştiricilerini kullanın.
  • /Op derleyici seçeneği kaldırılmıştır. Bunun yerine /fp (Floating-Point davranışını belirtin) kullanın.
  • OpenMP artık Visual C++ tarafından desteklenmektedir.
  • /openmp (OpenMP 2.0 Desteğini Etkinleştir) derleyici seçeneği eklendi.
  • /Ow derleyici seçeneği kaldırıldı ama sessizce göz ardı edilecek. noalias veya restrict__declspec değiştiricilerini kullanarak derleyicinin diğer adlandırma işlemini nasıl gerçekleştirdiğini belirtin.

Profile-Guided İyileştirmeleri

  • /QI0f kaldırıldı.
  • /QIfdiv kaldırıldı.
  • /QIPF_B (B CPU Aşaması için Errata) derleyici seçeneği eklendi.
  • /QIPF_C (C CPU Adımlama Erratası) derleyici seçeneği eklendi.
  • /QIPF_fr32 (Üst 96 Kayan Nokta Yazmaçlarını Kullanmayın) derleyici seçeneği eklendi.
  • /QIPF_noPIC (Konuma Bağımlı Kod Oluştur) derleyici seçeneği eklendi.
  • /QIPF_restrict_plabels (Çalışma Zamanında İşlev Oluşturulmadığını Varsay) derleyici seçeneği eklenmiştir.

Derleyici ve Bağlayıcıda Unicode Desteği

  • /vd (Yapı Yer Değiştirmelerini Devre Dışı Bırak) artık oluşturulan bir nesnede dynamic_cast İşleci kullanmanıza olanak tanır (/vd2)
  • /YX derleyici seçeneği kaldırıldı. Bunun yerine (Önceden Derlenmiş Üst Bilgi Dosyası Oluştur) veya /Yc (Önceden Derlenmiş Üst Bilgi Dosyası Kullan) kullanın /Yu . Derleme yapılandırmalarınızdan /YX öğesini kaldırır ve yerine bir şey koymazsanız, bu, daha hızlı derlemelerle sonuçlanabilir.
  • /Zc:forScope artık varsayılan olarak açıktır.
  • /Zc:wchar_t artık varsayılan olarak açıktır.
  • /Zd derleyici seçeneği kaldırıldı. Yalnızca satır numarası hata ayıklama bilgisi artık desteklenmeyecek. Bunun yerine kullanın /Zi (daha fazla bilgi için bkz. /Z7, /Zi, /ZI (Hata Ayıklama Bilgileri Biçimi).
  • /Zg artık yalnızca C kaynak kodu dosyalarında geçerlidir, C++ kaynak kodu dosyalarında geçerli değildir.
  • /Zx (Itanium Hata Ayıklama için İyileştirilmiş Kod) derleyici seçeneği eklendi.

Yeni Dil Özellikleri

  • attributeattribute artık kullanım dışı bırakıldı.
  • appdomain__declspec değiştirici eklendi.
  • __clrcall çağırma kuralı eklendi.
  • kullanım dışı bırakılmış (C++) declspec değiştiricisi artık kullanıcı kullanım dışı bırakılmış bir sınıfa veya işleve erişmeye çalıştığında derleme zamanında görüntülenecek bir dize belirtmenize olanak tanır.
  • dynamic_cast İşleçte önemli değişiklikler var.
  • Yerleşik numaralandırmalar artık temel alınan türü belirtmenizi sağlar.
  • jitintrinsicdeclspec değiştirici eklendi.
  • noaliasdeclspec değiştirici eklendi.
  • process__declspec değiştirici eklendi.
  • soyut, override ve sealed yerel derlemeler için geçerlidir.
  • __restrict anahtar sözcüğü eklendi.
  • restrictdeclspec değiştirici eklendi.
  • __thiscall artık bir anahtar sözcüktür.
  • __unaligned anahtar sözcüğü artık belgelenmiştir.
  • volatile (C++) iyileştirmelerle ilgili olarak güncelleştirilmiş davranışa sahiptir.

Yeni Önişlemci Özellikleri

  • önceden tanımlanmış __CLR_VER makro eklendi.
  • Açıklama (C/C++) pragması artık bağlayıcı açıklama olarak kabul eder /MANIFESTDEPENDENCY . Açıklama için exestr seçeneği artık kullanım dışı bırakıldı.
  • embedded_idl özniteliği (Yönergesi #import ) artık isteğe bağlı bir parametre alır.
  • fenv_access pragma
  • float_control pragma
  • fp_contract pragma
  • Pragma tarafından yönetilen, yönetilmeyen ve yönetilmeyen bölümlerde genel değişkenleriniz varsa genel değişkenler bildirildikleri sırayla başlatılmaz. Bu, örneğin yönetilmeyen bir genel değişken yönetilen genel değişkenlerle başlatılırsa ve tam olarak yapılandırılmış bir yönetilen nesne gerekiyorsa, hataya neden olabilecek bir değişikliktir.
  • init_seg ile belirtilen bölümler artık salt okunur durumdadır ve önceki sürümlerde olduğu gibi okuma/yazma işlemi yapılmaz.
  • varsayılan inline_depth 16'dır. Varsayılan değer olan 16, Visual C++ .NET 2003'te de etkindi.
  • Önceden tanımlı makro _INTEGRAL_MAX_BITS eklendi, bkz. Önceden Tanımlı Makrolar.
  • _M_CEE, _M_CEE_PURE ve _M_CEE_SAFE önceden tanımlanmış makrolar eklendi, bkz. Önceden Tanımlanmış Makrolar.
  • önceden tanımlanmış _M_IX86_FP makro eklendi.
  • önceden tanımlanmış _M_X64 makro eklendi.
  • make_public pragma
  • managed, unmanaged pragma söz dizimi güncelleştirildi (şimdi push ve pop içeriyor)
  • mscorlib.dll artık tüm #using derlemelerde /clr Yönergesi tarafından dolaylı olarak kullanılmaktadır.
  • önceden tanımlanmış _OPENMP makro eklendi.
  • optimize pragması güncelleştirildi, a ve w artık geçerli parametreler değil.
  • no_registry#import özniteliği eklendi.
  • region, endregion pragmaları eklendi
  • önceden tanımlanmış _VC_NODEFAULTLIB makro eklendi.
  • Variadic Makroları artık uygulanıyor.
  • vtordisp kullanım dışı bırakıldı ve Visual C++'ın gelecek bir sürümünde kaldırılacak.
  • Pragma warning artık gizleme belirticisine sahiptir.

Yeni Bağlayıcı Özellikleri

  • Modüllere (derleme olmayan MSIL çıkış dosyaları) artık bağlayıcıya giriş olarak izin verilir.
  • /ALLOWISOLATION (Bildirim Arama) bağlayıcı seçeneği eklendi.
  • /ASSEMBLYRESOURCE (Yönetilen Kaynak Ekle) artık derlemedeki kaynağın adını belirtmenize ve kaynağın derlemede özel olduğunu belirtmenize olanak tanıyacak şekilde güncelleştirildi.
  • /CLRIMAGETYPE (CLR Görüntüsü Türünü Belirt) bağlayıcı seçeneği eklendi.
  • /CLRSUPPORTLASTERROR (PInvoke Çağrıları için Son Hata Kodunu Koru) bağlayıcı seçeneği eklendi.
  • /CLRTHREADATTRIBUTE (CLR İş Parçacığı Özniteliğini Ayarla) bağlayıcı seçeneği eklendi.
  • /CLRUNMANAGEDCODECHECK (SuppressUnmanagedCodeSecurityAttribute Ekle) bağlayıcı seçeneği eklendi.
  • /ERRORREPORT (İç Bağlayıcı Hatalarını Bildir) bağlayıcı seçeneği eklendi.
  • /EXETYPE bağlayıcı seçeneği kaldırıldı. Bağlayıcı artık Windows 95 ve Windows 98 cihaz sürücüleri oluşturmayı desteklememektedir. Bu cihaz sürücülerini oluşturmak için uygun bir DDK kullanın. EXETYPE anahtar sözcüğü artık modül tanımı dosyaları için geçerli değildir.
  • /FUNCTIONPADMIN (Hotpatchable Görüntü Oluştur) linker seçeneği eklendi.
  • /LTCG bağlayıcı seçeneği artık ile /clrderlenmiş modüllerde desteklenmektedir. /LTCG ayrıca profil destekli iyileştirmeleri destekleyecek şekilde güncelleştirildi.
  • /MANIFEST (Yan Yana Derleme Bildirimi Oluştur) bağlayıcı seçeneği eklendi.
  • /MANIFESTDEPENDENCY (Bildirim Bağımlılıklarını Belirt) bağlayıcı seçeneği eklendi.
  • /MANIFESTFILE (Ad Bildirim Dosyası) bağlayıcı seçeneği eklendi.
  • /MAPINFO:LINES bağlayıcı seçeneği kaldırıldı.
  • /NXCOMPAT (Veri Yürütme Engellemesi ile uyumlu) bağlayıcı seçeneği eklendi.
  • /PGD (Profile-Guided İyileştirmeler için Veritabanı Belirt) bağlayıcı seçeneği eklendi.
  • /PROFILE (Performans Araçları Profiler) bağlayıcı seçeneği eklendi.
  • /SECTION (Bölüm Özniteliklerini Belirt) bağlayıcı seçeneği artık öznitelik olumsuzlama özelliğini destekler ve artık L veya D (VxD ile ilgili) öznitelikleri desteklemez.
  • Derleyici ve Bağlayıcıda Unicode Desteği
  • /VERBOSE (İlerleme İletilerini Yazdır) bağlayıcı seçeneği artık ICF ve REF'yi de kabul ediyor.
  • /VXD bağlayıcı seçeneği kaldırıldı. Bağlayıcı artık Windows 95 ve Windows 98 cihaz sürücüleri oluşturmayı desteklememektedir. Bu cihaz sürücülerini oluşturmak için uygun bir DDK kullanın. VXD anahtar sözcüğü artık modül tanımı dosyaları için geçerli değildir.
  • /WS bağlayıcı seçeneği kaldırıldı. /WS , Windows NT 4.0 için hedeflenen görüntüleri değiştirmek için kullanıldı. IMAGECFG.exe -R dosya adı yerine /WSkullanılabilir. IMAGECFG.exe Windows NT 4.0 CD-ROM SUPPORT\DEBUG\I386\IMAGECFG.EXE konumunda bulunabilir.
  • /WX (Bağlayıcı Uyarılarını Hata Olarak Kabul Edin) bağlayıcı seçeneği artık belgelenmiştir.

Yeni Bağlayıcı Yardımcı Programı Özellikleri

  • /ALLOWISOLATION editbin seçeneği eklenmişti
  • DESCRIPTION modül tanım dosyası ifadesi kaldırıldı. Bağlayıcı artık sanal cihaz sürücülerinin oluşturulmasını desteklememektedir.
  • /ERRORREPORT seçeneği bscmake.exe, dumpbin.exe, editbin.exeve lib.exeeklendi.
  • /LTCG lib seçeneği eklendi.
  • /NXCOMPAT editbin seçeneği eklendi.
  • /RANGE dumpbin seçeneği eklendi.
  • /TLS dumpbin seçeneği eklendi.
  • /WS editbin seçeneği kaldırıldı. /WS , Windows NT 4.0 için hedeflenen görüntüleri değiştirmek için kullanıldı. IMAGECFG.exe -R dosya adı yerine /WSkullanılabilir. IMAGECFG.exe Windows NT 4.0 CD-ROM SUPPORT\DEBUG\I386\IMAGECFG.EXE konumunda bulunabilir.
  • /WX[:NO] lib seçeneği eklendi.

Yeni NMAKE Özellikleri

  • /ERRORREPORT eklendi.
  • /G eklendi.
  • Önceden tanımlanmış kurallar güncelleştirildi.
  • Özyineleme Makroları'nda belgelenen $(MAKE) makrosu artık nmake.exeiçin tam yolu verir.

Yeni MASM Özellikleri

  • MASM ifadeleri artık 64 bit değerlerdir. Önceki sürümlerde MASM ifadeleri 32 bit değerlerdi.
  • int 3__asm yönergesi artık bir işlevin yerel olarak derlenmiş olmasına neden oluyor.
  • ALIAS (MASM) artık belgelenmiştir.
  • /ERRORREPORT ml.exe ve ml64.exe seçeneği eklenir.
  • FPO artık belgelenmiştir.
  • H2INC.exe Visual C++ 2005 ile gönderilmeyecek. H2INC kullanmaya devam etmeniz gerekiyorsa Visual C++ uygulamasının önceki bir sürümünden H2INC.exe kullanın.
  • IMAGEREL operatörü eklendi.
  • Operatör HIGH32 eklendi.
  • işleci LOW32 eklendi.
  • ml64.exe, x64 mimarisi için BIR MASM sürümüdür. x64 .asm dosyalarını x64 nesne dosyalarında birleştirir. Satır içi derleme dili x64 derleyicisinde desteklenmez. ml64.exe için aşağıdaki MASM yönergeleri eklendi (x64):
  • . ALLOCSTACK
  • . ENDPROLOG
  • . PUSHFRAME
  • . PUSHREG
  • . SAVEREG
  • . SAVEXMM128
  • . SETFRAME Ayrıca, PROC yönergesi yalnızca x64 söz dizimi ile güncelleştirildi.
  • MMWORD yönergesi eklendi
  • /omf (ML.exe komut satırı seçeneği) artık anlamına gelir /c. ML.exe OMF biçim nesnelerini bağlamayı desteklemez.
  • SEGMENT yönergesi artık ek öznitelikleri destekliyor.
  • SECTIONREL işleci eklendi.
  • XMMWORD yönergesi eklendi

Yeni CRT Özellikleri

  • Çeşitli işlevlerin güvenli sürümleri eklendi. Bu işlevler hataları daha iyi bir şekilde işler ve ortak güvenlik açıklarını önlemeye yardımcı olmak için arabelleklerde daha sıkı denetimler uygular. Yeni güvenli sürümler _s soneki ile tanımlanır.
  • Birçok işlevin mevcut daha az güvenli sürümleri kullanım dışı bırakılmıştır. Kullanımdan kaldırma uyarılarını devre dışı bırakmak için _CRT_SECURE_NO_WARNINGS tanımlayın.
  • Mevcut işlevlerin çoğu artık parametrelerini doğrular ve geçersiz parametre geçirildiğinde geçersiz parametre işleyicisini çağırır.
  • Mevcut işlevlerin çoğu artık daha önce ayarlamadıkları bir yere errno ayarlamaktadır.
  • Tamsayı türüne sahip typedef errno_t eklendi. errno_t , bir işlev dönüş türü veya parametresinden gelen errnohata kodlarıyla çalıştığında kullanılır. errno_t, errcode'in yerini alır.
  • Yerel ayara bağımlı işlevler artık geçerli yerel ayarı kullanmak yerine yerel ayarı parametre olarak alan sürümlere sahiptir. Bu yeni işlevler _l son ekine sahiptir. Yerel ayar nesneleriyle çalışmak için birkaç yeni işlev eklendi. Yeni işlevler arasında _get_current_locale, _create_locale ve _free_localebulunur.
  • Dosya tanıtıcılarının kilitlenmesini ve kilidinin açılmasını desteklemek için yeni işlevler eklendi.
  • İşlev _spawn ailesi, önceki sürümlerde olduğu gibi başarılı olduğunda errno'ları sıfıra sıfırlamaz.
  • printf İşlev ailesinin bağımsız değişkenlerin hangi sırada kullanıldığını belirtmenize olanak tanıyan sürümleri kullanılabilir.
  • Unicode artık desteklenen bir metin biçimidir. işlevi _open _O_TEXTW, _O_UTF8 ve _O_UTF16 özniteliklerini destekler. İşlev, fopen Unicode biçimi belirtmek için "ccs=ENCODING" yöntemini destekler.
  • Yönetilen kodda (MSIL) yazılmış CRT kütüphanelerinin yeni bir sürümü artık kullanılabilir ve /clr (Ortak Dil Çalışma Zamanı Derlemesi - CLR) seçeneğiyle derlenirken kullanılır.
  • _fileinfo kaldırıldı.
  • 64 bit olan time_t için varsayılan boyut, time_t ve birkaç zaman işlevinin aralığını 3000 yılına kadar genişletir.
  • CRT artık iş parçacığı başına yerel ayar ayarlamasını destekliyor. İşlev _configthreadlocale , bu özelliği desteklemek için eklendi.
  • x87 ve SSE2 kayan nokta işlemcisinde kayan nokta denetim sözcüğüne erişim ve kontrol sağlamak için _statusfp2 ve __control87_2 işlevleri eklendi.
  • _mkgmtime ve _mkgmtime64 işlevleri, zamanların (yapı tm) Greenwich Ortalama Saati'ne (GMT) dönüştürülmesi için destek sağlamak üzere eklendi.
  • swprintf ve vswprintf'de standartla daha iyi uyum sağlamak için değişiklikler yapıldı.
  • Yeni bir üst bilgi dosyası, INTRIN. H, bazı iç işlevler için prototipler sağlar.
  • İşlevin fopen artık bir N özniteliği var.
  • İşlevin _open artık bir _O_NOINHERIT özniteliği var.
  • atoi işlevi şimdi INT_MAX döndürür ve taşma durumunda errno'yi ERANGE olarak ayarlar. Önceki sürümlerde taşma davranışı tanımlanmamıştı.
  • printf İşlev ailesi, %a ve %Abiçim türü tanımlayıcıları kullanılarak ANSI C99 standardına göre uygulanan onaltılık kayan nokta çıkışını destekler.
  • Aile printf artık "ll" (uzun uzun) boyut ön ekini destekliyor.
  • İşlev _controlfp , daha iyi performans için iyileştirilmiştir.
  • Bazı işlevlerin hata ayıklama sürümleri eklendi.
  • _chgsignl ve _cpysignl (long double sürümleri) eklendi.
  • Type tablosuna _locale_t tür eklendi.
  • Bir dizideki öğe sayısını hesaplamaya yönelik yeni makro _countof eklendi.
  • Her işlev konusuna .NET Framework eşdeğerleri ile ilgili bir bölüm eklenmiştir.
  • Birkaç dize işlevi artık çıkış arabellekleri çok küçük olduğunda başarısız olmak yerine dizeleri kesme seçeneğine sahiptir; bkz. _TRUNCATE.
  • _set_se_translator şimdi derleyici seçeneğinin /EHa kullanılmasını gerektirir.
  • fpos_t artık __int64 (C kodu için) altındadır /Za ve __STDC__ el ile ayarlandığında (C++ kodu için). Eskiden bir struct.
  • _CRT_DISABLE_PERFCRIT_LOCKS tek iş parçacığına sahip programların Girdi/Çıktı performansını geliştirebilir.
  • POSIX adları yerine ISO C++ uyumlu adlar (örneğin, _getch yerine getch) kullanmanız önerilmektedir.
  • Yeni bağlantı seçenekleri .obj dosyalar saf modda kullanılabilir
  • _recallocve reallocözelliklerini calloc birleştirir.

Visual Studio 2003'teki C++'daki Yenilikler

Derleyici

  • Geçerli sürümün derleyicisi ile oluşturulmuş bir C++ uygulaması için Yönetilen Uzantıları, çalışma zamanının önceki bir sürümünde çalıştırma hakkında bilgi.
  • C++ için Yönetilen Uzantılar Sık Sorulan Sorular.
  • Mevcut yerel bir uygulamayı C++için Yönetilen Uzantıları kullanacak şekilde taşımayı gösteren bir izlenecek yol eklendi: İzlenecek yol: .NET Framework Bileşenleriyle Birlikte Çalışabilmek için Mevcut Bir Yerel C++ Uygulamasını Taşıma.
  • Artık değer türündeki bir yöntemde temsilci oluşturabilirsiniz.
  • Derleyicinin C++ standardıyla uyumluluğu Visual C++ .NET 2003 için önemli ölçüde geliştirilmiştir.
  • /arch derleyici seçeneği eklenir.
  • /Gf kullanım dışıdır ve Visual C++'ın sonraki sürümünde kaldırılacaktır.
  • /G7 derleyici seçeneği eklenir.
  • Derleyici /GS seçeneği, yerel değişkenlerin doğrudan arabellek taşmalarına karşı korunmasına yardımcı olmak için geliştirilmiştir.
  • Derleyici /noBool seçeneği kaldırıldı. Derleyici artık C++ kaynak kodu dosyasında yalnızca anahtar sözcük (tanımlayıcı değil) olarak görünmeye izin verir bool .
  • Türü long long, artık bir typedef olarak __int64 şeklinde mevcuttur. CRT'de long long için henüz destek olmadığını unutmayın.
  • Derleyici /Zm seçeneği artık önceden derlenmiş üst bilgi bellek ayırma sınırını belirtir.
  • _InterlockedCompareExchange fonksiyonu artık belgelenmiştir.
  • _InterlockedDecrement işlevi artık belgelenmiştir.
  • _InterlockedExchange artık dokümante edilmiştir.
  • _InterlockedExchangeAdd yerleşik fonksiyonu artık belgelenmiştir.
  • _InterlockedIncrement intrinsic artık belgeleniyor.
  • _ReadWriteBarrier öğesi eklendi.

Özellikler

  • implements özniteliği artık belgelenmiştir.

Bağlayıcı özellikleri

Aşağıdaki bağlayıcı anahtarları eklendi:

  • /ASSEMBLYDEBUG
  • /ASSEMBLYLINKRESOURCE
  • DELAYSIGN (Gecikmeli İmza)
  • /KEYFILE
  • /ANAHTAR KABİ
  • /SAFESEH

MASM

. SAFESEH yönergesi ve /safeseh ml.exe seçeneği eklendi.

Ayrıca bakınız

Visual C++ Taşıma ve Yükseltme Kılavuzu