Share via


Visual C++ 2003 ile 2015 Arasındaki Farklar

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.

Dekont

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'da Visual 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ı.

  • Artık mstest.exe ile komut satırından C++/CLI ile birim testleri çalıştırasınız. Bunun yerine vstest.console.exe dosyasını 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 char32_t diğer adları olarak tanımlaması uint32_tchar16_tuint16_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.

  • Özel durumları işleme

    Ö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üncelleştirmek için özel durum nesnenizin kopya oluşturucusunun ortak olduğundan ve işaretlenmediğinden explicitemin 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), Visaul C++ uygulamasını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 (yerleştirme yeni işlecine deletekarşı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 void * operator new(size_t, size_t)karşılık gelen bir yerleştirme silme işleciydi. C++14 boyutlu serbest bırakma ile bu delete işlev artık normal bir serbest bırakma işlevidir (genel delete işleç). Standart, yeni bir yerleştirmenin kullanılması, karşılık gelen delete bir işlevi arar ve normal bir serbest bırakma işlevi bulursa programın kötü biçimlendirilmiş olmasını gerektirir.

    Ö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 yerleştirme ve delete işleçler size_t 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 unsigned int olduğunu typedef 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 tanımınızı değiştirin ve delete bu türü yerine size_tikinci bağımsız değişken olarak kullanın. Ayrıca, yeni türü geçirmek için çağrıları yeni yerleştirmeye güncelleştirmeniz (örneğin, tamsayı değerinden dönüştürmek için kullanarakstatic_cast<my_type>) ve tanımını new güncelleştirerek ve delete tamsayı türüne geri döndürmeniz 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. U birleşiminin, yıkıcısı olan adlandırılmış bir S yapısı olan bir üye içeren anonim bir yapı içerdiği aşağıdaki kodu göz önünde bulundurun.

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

    Visual Studio 2013'te, birleşim oluşturulduğunda S 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 ilk çağrının 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, yeni satır içi işleç bozuk 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üradı Derleyicinin ayrıntılı tür tanımlayıcılarında izin verilen typename önceki sürümleri; bu şekilde yazılan 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 geçmiş aday kadar iyi olan ek bir adayı dikkate almasına neden olduğunda, çağrı belirsiz hale gelir ve derleyici sonuç olarak derleyici hatası C2668'i döndürür.

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

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

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

    Örnek 2: aşırı yü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ın istendiği gibi gizlenmesi için, yönergesini #pragma warning(disable:####) ilk sorunlu olabilecek durumun üzerindeki 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 #pragma uyarısı(pop) (yalnızca etkiler/Wall/WX)

    Derleyicinin önceki sürümleri, durum değişikliklerinin nadiren amaçlanan farklı bir kaynak dosyasındaki durum değişiklikleriyle #pragma warning(pop) eşleştirildiğini algılamadı#pragma warning(push). 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 başvuran 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

    Derleyicinin izlenen #pragma warning durumunun önceki sürümleri, istenen tüm uyarıları vermek için yeterince iyi şekilde değişiklik gösterir. 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 durumu daha sağlam bir şekilde izler #pragma warning (özellikle şablonların içindeki durum değişiklikleriyle #pragma warning ilgili) ve isteğe bağlı olarak programcının ve #pragma warning(pop)'in istenmeyen kullanımlarını #pragma warning(push) bulmasına yardımcı olmak için C5031 ve C5032 yeni uyarılar verir.

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

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

    C++ Standart Kitaplığı değişiklikleri ve derleyicinin önceki sürümlerine göre işlev çağrılarını satır içi 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
      }
    
  • Kayıt kaldırma iyileştirmesinin pow(T, int) kaldırılması

    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, bu sürümü pow doğru hesaplamadan ç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 decltype adın bir tür olduğunu belirtmek için anahtar sözcüğün typename gerekli kullanımını eksik olan bir ifadeyi ayrıştırdığında, derleyici C2923 derleyici hatasıyla birlikte derleyici uyarısı C4346'yı döndürür.

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

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

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

    Örnek 2 (sonra)

      template <typename T> struct s1 {...};  // as above
      template <typename T> struct s2 {...};  // as above
    
      template <typename T>
      T declval();
    
      struct s
      {
        template <typename T>
        auto f(T t) -> decltype(t(declval<S1<typename S2<T>::type>::type>()));
      };
    
  • volatileüye değişkenleri örtük olarak tanımlanmış oluşturucuları ve atama işleçlerini önler 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, derleyici anahtarı kullanılarak .Net Framework için yönetilen C++ kodu derlendiğinde olduğu gibi türlerin iletilmesine /clr izin enum 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 hatalı olarak olarak ayarlandığından truegeçerstd::is_convertable<>::value. Ş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 /wd4467 komut satırı bağımsız değişkenlerini derleyiciye geçirerek /Wv:18 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 -Yu derlemeleri arasında -Yc 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 -Yu derlemeleri arasında -Yc derleyiciye yönelik dizin (-I) 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.
  • Temsilci oluşturucuları
  • Açık dönüştürme işleçleri.
  • Başlatıcı listeleri ve tekdüzen başlatma.
  • Ham dize değişmez değerleri.
  • Variadic şablonları.
  • Diğer 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şmez değerler.
  • Atanan 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ı. Rvalue başvuruları ile C++11, lvalue'lar ve rvalue'lar arasında net bir şekilde 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.

Dekont

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üncelleştirilir (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ı.

Hataya Neden Olan 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 zaman uyumsuz 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. Vektör yazmaçlarını kullanmak için __vectorcall çağırma kuralını kullanarak vektör türü bağımsız değişkenlerini geçirin.
  • 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ı uygulama geliştirme için yeni PGO.

uygulama geliştirme desteği Windows Çalışma Zamanı

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

    Artık null olabilecek alanları kullanarak (örneğin, yerineint) IBox<int>^ 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).

Dekont

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ı uygulama yazmanıza yardımcı olabilir.

Tanılama Geliştirmeleri

  • Hata Ayıklayıcı Geliştirmeleri. Zaman uyumsuz hata ayıklama ve Yalnızca 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 Tanılama. 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 yakalama ve kayıttan yürütme.
  • 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.

3-B Grafik Geliş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ım Aracı 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 ayraç)
  • ( (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 arka planda başvuruları otomatik olarak çözümler ve filtreler.

Bağlam Tabanlı Ü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ı'na geçin. 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. Olay işleyicisi kodu otomatik olarak oluşturulabildiğinde bir araç ipucu penceresi görüntülenir.

DPI Farkındalığı Geliştirme. Uygulama bildirim dosyaları için DPI Tanıma ayarı artık "Monitör Başına Yüksek DPI Algılamalı" 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.

Derleme 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

  • Döngüler için aralık tabanlı. ( for-range-declaration : expression ) biçiminde diziler, STL kapsayıcıları ve Windows Çalışma Zamanı koleksiyonlarla çalışan daha sağlam döngüler yazabilirsiniz. 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.

  • Kapsamlı sabit listeleri 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
    

uygulama geliştirme desteği Windows Çalışma Zamanı

  • 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ı için 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 birlikte çalışma. Hem XAML hem de DirectX kullanan Windows Çalışma Zamanı uygulamalar artık verimli bir şekilde birlikte çalışabilir.
  • Bileşen DLL'sini geliştirme Windows Çalışma Zamanı. 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 yönergeleri kullanan yönergeleri yayar. 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++ Accelerated Massive Parallelism (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).
  • priority_queue, kuyruk, vektör ve eşleme gibi std veri yapılarının iş parçacığı açısından güvenli sürümlerini sağlayan eşzamanlılık açısından güvenli kapsayıcı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.

Zaman Uyumsuz Çözüm Yükü. 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ı. İskelet kodu, Liste Üyeleri açılan listesinde, eğer-değilse, döngü ve diğer temel kod yapıları için kullanılabilir. 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>C/C++>Gelişmiş 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.

Başvuru 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 Telefon için Express sürümlerinde yalnızca en kritik uyarılar yer alır. 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ı terslerini, çağıran/çağıran kilitlenen sözleşme ihlallerini, eşleşmeyen eşitleme 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. Unittest1.cpp dosyasında oluşturulan TEST_METHOD kod saplamasında birim testlerinizi yazmaya başlayın. Test kodu yazıldığında çözümü oluşturun. Testleri çalıştırmak istediğinizde, Diğer Windows>Birim Test Gezgini'ni Görüntüle'yi>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 kodu 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 izlemek için güncelleştirildi. 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'nde Kod Kapsamını Analiz Et'i seçin. Kod kapsamı sonuçlarını Kod Kapsamı Sonuçları penceresinde inceleyebilirsiniz. Menü çubuğunda Windows>Kod Kapsamı Sonuçlarını Test Et'i>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 bileşimini kullanın. Alternatif olarak, başka bir işlevi çağıran bir şablon işlevi bildirin ve ardından çağrılan işlevin dönüş türünü döndürür.

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 Başvurusu. rvalue başvuru bildirimcisi (&) bir rvalue başvurusu 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. Bildirim static_assert , çalışma zamanında test eden diğer onaylama mekanizmalarından farklı olarak 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, derleyici seçeneğini kullandığınızda /clr yönetilen kod, seçeneğini kullanmadığınızda ise yerel kod olarak yorumlar.nullptr/clr 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 ?? öğesinin yerini alır. = # (sayı işareti) karakteriyle trigraf. C kaynak dosyalarında belirli noktalama işaretleri içermeyen bir karakter kümesi kullanan trigrafları kullanın.

Yeni Profil Destekli İyileştirme Seçeneği. Pogo Kasa Mode, 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. Kasa modu 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 İç Bilgileri, FMA4 İç bilgileri ve LWP İç bilgileri. 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.exe'nin yerini alan MSBuild.exe kullanılarak oluşturulmuş. 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. Eski _SECURE_SCL yerine bu makroyu kullanın ve makroları _HAS_ITERATOR_DEBUGGING.

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. Zaman Uyumsuz Aracılar Kitaplığı, kaba ayrıntılı veri akışı ve kanal oluşturma görevleri için aktör tabanlı bir programlama modeli ve ileti geçirme 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 rvalue başvurusu C++ dil özelliği, Standart Şablon Kitaplığı'ndaki birçok işlev için taşıma semantiğini ve mükemmel iletmeyi 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ı, sınıftan daha güvenli bir akıllı işaretçi türü auto_ptr olan yeni unique_ptr sınıfı 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.
  • Algoritma> üst bilgisine <, ve is_sortedgibi find_if_notcopy_ifon beş yeni işlev 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, crbeginve crend üye işlevleri, kapsayıcı const_iterator boyunca ileri veya geri hareket eden bir sağlar.
  • <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 bilgide <çok sayıda güncelleştirme vardır.

Microsoft Foundation Sınıfı (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.

Çok dokunmalı farkındalık. 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.

Yüksek DPI Farkındalığı. Varsayılan olarak, MFC uygulamaları artık Yüksek DPI kullanan uygulamalardır. Bir uygulama Yüksek DPI (inç başına yüksek nokta) kullanıyorsa, 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 Kasa Int 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.

/analyze Uyarıları

Çoğu /analyze (Kurumsal Kod Analizi) uyarısı C Çalışma Zamanı (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 izlenecek yollar İzlenecek Yol: MFC Projesine D2D Nesnesi Ekleme ve İzlenecek Yol: 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ım Aracı. Şerit Tasarım Aracı, 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ım Aracı ç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ç deyimle 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 . ATL denetiminde yoksa ProgID, diğer araçlar bununla çalışmayabilir. Denetimlerin etkin denetime sahip ProgID olmasını gerektiren bir araç örneği, Etkin Denetim Ekle iletişim kutusudur. İletişim kutusu hakkında daha fazla bilgi için bkz . ActiveX denetimleri ekleme.

Microsoft Macro Assembler Başvurusu

YMMWORD veri türünün eklenmesi, Intel Advanced Vector Extensions (AVX) yönergelerinde yer alan 256 bit multimedya işlenenlerini destekler.

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ı programlama değişikliği olmadan otomatik olarak HKEY_CURRENT_USER yönlendirir.

  • Sınıf Tasarım Aracı artık yerel C++ kodu için sınırlı desteğe sahiptir. Visual Studio'nun önceki sürümlerinde Sınıf Tasarım Aracı yalnızca Visual C# ve Visual Basic ile çalışıyordu. C++ kullanıcıları artık Sınıf Tasarım Aracı kullanabilir, ancak yalnızca salt okunur modda kullanabilir. C++ ile Sınıf Tasarım Aracı kullanma hakkında daha fazla bilgi için bkz. Sınıf Tasarım Aracı 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 Denetimleri 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++ sıralama 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 bkz . C++ dilinde Hazırlamaya Genel Bakış.

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, yönetilen 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. Hataya Neden Olan 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 iç bilgiler 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 İşleme İç bilgileri, AES İç bilgileri, _mm_clmulepi64_si128 ve __rdtscp.
  • __cpuid İşlev güncelleştirilir. __cpuid, __cpuidex işlevleri artık AMD ve Intel işlemcilerin en son düzeltmelerinden birkaç yeni özelliği desteklemektedir. İç __cpuidex bilgi yenidir ve 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. Varsayılan olarak bu özellik 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 zamanında rastgele yeniden temellendirilip temel alınmayacağını 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

  • __halt
  • __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 derleyiciler arası.
  • /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 .
  • Kodda /clr çift thunking azaltıldı; daha fazla bilgi için bkz. Double Thunking (C++).
  • /EH (Özel Durum İşleme Modeli) veya /EHs artık oluşturma dışında bir şeyle tetiklenen bir özel durumu yakalamak için kullanılamaz; kullanın /EHa.
  • /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 (Kayan Nokta Davranışını 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 (Çalışırken Eşlenebilir 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 bkzinline. , __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 yeni çağrılar bir özel durum oluşturur.
  • /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 desteklemiyor.
  • Derleyici, ile /O1/O2 derlendiğinde (Boyutu Küçült, Hızı En Üst Düzeye Çıkar), (Genel İyileştirmeler) /Og ve /Ox (Tam İyileştirme) etkinleştirilen Adlandırılmış Dönüş Değeri İyileştirmesini uyguladı.
  • /Oa derleyici seçeneği kaldırıldı ancak sessizce yoksayılacak; derleyicinin noalias diğer ad kullanmayı nasıl yaptığını belirtmek için veya restrict__declspec değiştiricilerini kullanın.
  • /Op derleyici seçeneği kaldırılmıştır. Bunun yerine (Kayan Nokta Davranışını Belirtin) kullanın /fp .
  • 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ı ancak sessizce yoksayılacak. Derleyicinin noalias diğer ad oluşturma işlemini nasıl yaptığını belirtmek için veya restrict__declspec değiştiricilerini kullanın.

Profil Temelli İyileştirmeler

  • /QI0f Kaldırıldı.
  • /QIfdiv Kaldırıldı.
  • /QIPF_B (B CPU Adımlama için Errata) derleyici seçeneği eklendi.
  • /QIPF_C (C CPU Adımlama için Errata) 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.

Derleyicide 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 /Yu (Önceden Derlenmiş Üst Bilgi Dosyası Kullan) kullanın /Yc . Derleme yapılandırmalarınızdan kaldırır /YX ve bunu hiçbir şeyle değiştirirseniz, daha hızlı derlemelere neden olabilir.
  • /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 bilgileri artık desteklenmiyor. 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 (Hata Ayıklama için İyileştirilmiş Itanium Kodu) 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 hataya neden olan değişiklikler var.
  • Yerel sabit listeleri artık temel alınan türü belirtmenize olanak sağlar.
  • jitintrinsicdeclspec değiştirici eklendi.
  • noaliasdeclspec değiştirici eklendi.
  • process__declspec değiştirici eklendi.
  • soyut, geçersiz kılma ve korumalı 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ımlanmış makro _INTEGRAL_MAX_BITS, bkz. Önceden Tanımlanmış Makrolar.
  • Önceden tanımlanmış makroları _M_CEE, _M_CEE_PURE ve _M_CEE_SAFE, 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 ve popvar push )
  • mscorlib.dll artık tüm /clr derlemelerde Yönergesi #using tarafından örtük olarak başvuruldu.
  • ö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 (Çalışırken Eşlenebilir Görüntü Oluştur) bağlayıcı 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 (Profil Destekli İyileştirmeler için Veritabanını Belirt) bağlayıcı seçeneği eklendi.
  • /PROFILE (Performans Araçları Profil Oluşturucu) 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.
  • Derleyicide 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'unda 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ı dosya deyimi 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.exe ve lib.exe'ye eklendi.
  • /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'unda SUPPORT\DEBUG\I386\IMAGECFG.EXE konumunda bulunabilir.
  • /WX[:NO] lib seçeneği eklendi.

Yeni NMAKE Özellikleri

  • /ERRORREPORT Eklenmiştir.
  • /G Eklenmiştir.
  • Önceden tanımlanmış kurallar güncelleştirildi.
  • Özyineleme Makroları'nda belgelenen $(MAKE) makro, şimdi nmake.exe dosyasının tam yolunu 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'te gönderilmeyecek. H2INC kullanmaya devam etmeniz gerekiyorsa Visual C++ uygulamasının önceki bir sürümünden H2INC.exe dosyasını kullanın.
  • IMAGEREL işleci eklendi.
  • high32 işleci 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 (x64) için aşağıdaki MASM yönergeleri eklendi:
  • .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 ayarlanmıştır errno .
  • 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 öğesinin yerini alır errcode.
  • 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 sonekine 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) yerleşik CRT kitaplıklarının yeni bir sürümü artık kullanılabilir ve (Ortak Dil Çalışma Zamanı Derlemesi) seçeneğiyle /clr derlenirken kullanılır.
  • _fileinfo kaldırıldı.
  • için time_t varsayılan boyut şimdi 64 bittir ve bu da ve birkaç zaman işlevinin aralığını time_t 3000 yılına genişletir.
  • CRT artık iş parçacığı başına yerel ayarın ayarlanmasını destekliyor. İşlev _configthreadlocale , bu özelliği desteklemek için eklendi.
  • _statusfp2 hem x87 hem de SSE2 kayan nokta işlemcisinde kayan nokta denetim sözcüğüne erişim ve denetimine izin vermek için 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.
  • Ve'de swprintfvswprintf 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.
  • İşlev atoi artık INT_MAX döndürür ve taşmada ERANGE olarak ayarlar errno . Önceki sürümlerde taşma davranışı tanımlanmamıştı.
  • printf İşlev ailesi, %a ve %A biç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.
  • ve _cpysignl (uzun çift sürümler) eklendi_chgsignl.
  • Tür tablosuna tür eklendi _locale_t .
  • 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ıklı programların G/Ç performansını geliştirebilir.
  • POSIX adları, ISO C++ uyumlu adları (örneğin yerine kullanın _getch ) yerine kullanımdan getchkaldırılmıştır.
  • Yeni bağlantı seçenekleri .obj dosyaları saf mod için kullanılabilir
  • _recallocve callocözelliklerini realloc birleştirir.

Visual Studio 2003'teki C++'daki Yenilikler

Derleyici

  • Çalışma zamanının önceki bir sürümünde geçerli sürümün derleyicisi ile oluşturulmuş bir C++ için Yönetilen Uzantılar uygulamasını çalıştırma hakkında bilgi.
  • C++ için Yönetilen Uzantılar Sık Sorulan Sorular.
  • Var olan bir yerel uygulamanın C++ için Yönetilen Uzantılar kullanmak üzere nasıl taşınabilir olduğunu gösteren bir izlenecek yol eklendi: İzlenecek yol: .NET Framework Bileşenleriyle Birlikte Çalışabilmek için Var Olan 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 CRT'de henüz desteklenmediğini long long belirten bir typedef__int64 Not olarak kullanılabilir.
  • Derleyici /Zm seçeneği artık önceden derlenmiş üst bilgi bellek ayırma sınırını belirtir.
  • _InterlockedCompareExchange artık belgelenmiştir.
  • _InterlockedDecrement artık belgelenmiştir.
  • _InterlockedExchange artık belgelenmiştir.
  • _InterlockedExchangeAdd artık belgelenmiştir.
  • _InterlockedIncrement iç artık belgelenmiştir.
  • _ReadWriteBarrier iç eklendi.

Özellikler

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

Bağlayıcı özellikleri

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

  • /ASSEMBLYDEBUG
  • /ASSEMBLYLINKRESOURCE
  • DELAYSIGN
  • /KEYFİLE
  • /KEYCONTAİNER
  • /SAFESEH

MASM

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

Ayrıca bkz.

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