Son değişiklikleri C 11'de sunulan nelerdir?
Biliyorum ki en az bir değişiklik C 11 olacak çünkü bazı eski kod durdurmak derleme: giriş explicit operator bool()
standart kütüphane, yerine eski örnekleri operator void*()
. Verilen kod bu olacak sonu muhtemelen bir kod gerekir değilmiş geçerli ilk başta, ama hala bir kırılma değiştirmek yine de: programlar eskiden geçerli artık.
Diğer son değişiklikleri var mı?
CEVAP
Bu doğrudan yabancı yatırımların Ek C.2
uyumsuzluklar için bir bölüm var, "C ve C 2003". ISO
Özet, işte bu amaçla ' (daha iyi) bir cevap olarak uygun hale getirmek için yorumladım. Ben de bazı örnekler farklılıkları göstermek için ekledim.
Diğerleri biraz açmak için bir kaç bırakıyorum o yüzden tam olarak etkilerini bilmiyorum ile ilgili bir kütüphane uyumsuzluklar vardır.
Temel dil
#define u8 "abc"
const char *s = u8"def"; // Previously "abcdef", now "def"
#define _x "there"
"hello"_x // now a user-defined-string-literal. Previously, expanded _x .
Yeni anahtar kelimeler: alignas,, char16_t, char32_t, constexpr, decltype,,, static_assert, noexcept nullptr ve thread_local alignof
Belirli bir tamsayı hazır bilgi uzun tarafından temsil edilebilir daha büyük uzun uzun imzalanan işaretsiz bir tamsayı türü değişebilir.
C 0 x 0 her zaman doğru sonucu mermi ise 0 doğru tamsayı bölme mermi kullanan C 2003 geçerli kod sonuç veya negatif sonsuza doğru.
(gerçekten çoğu insan için bir uyumluluk sorunu kuşkusuz.
auto
Depolama sınıfı belirleyicisi olarak anahtar kullanan geçerli C 2003 C kodu 0x geçersiz olabilir.
Dönüşümleri daraltmaya C 03 uyumsuzluklar neden. Örneğin, aşağıdaki kodu ınt çift daraltma dönüştürmesi çünkü C 2003 içinde geçerli ama bu Uluslararası Standart geçersiz:
int x[] = { 2.0 };
Örtülü olarak bildirilen özel üye işlevleri örtülü tanımı kötü oluşturulacaktır silinmiş olarak tanımlanır.
Tanımı gerekli olmadığı bir bağlamda bu özel üye işlevleri kullanan geçerli C 2003 programı (örneğin, potansiyel olarak değerlendirildiği bir anlatım) kötü oluşmuş olur.
Bana göre örnek:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C 03, invalid in C 0x */ }
Bu boyutu hileler bazı SFİNAE ve artık değiştirilmesi gerekiyor:) tarafından kullanılmıştır
Kullanıcı-ilan yıkıcılar örtülü özel bir şartname var.
Bana göre örnek:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
Bu kod C 0x ama terminate
C 03 etmez diyor. C 0x A::~A
örtülü özel durum belirtimi çünkü noexcept(true)
.
C 2003 geçerli bir beyanı
export
içeren C 0x kötü bir şey oluşur.
C 2003 geçerli bir ifade
>
hemen>
başka bir tarafından takip içeren şimdi iki şablonları kapanış olarak tedavi edilebilir.
C 03, >>
Her zaman vardiya-operatör token olurdu.
İç bağlantı ile fonksiyonları bağımlı aramasına izin verme.
Bana göre örnek:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
03, bu f(long)
ama C 0 x, bu çağrıları C aramalar f(int)
. C-03 ve C de 0, aşağıdaki f(B)
(örnekleme bağlamında hala sadece dış bağlantı bildirimleri dikkate alır) aramaları unutulmamalıdır.
struct B { };
struct A : B { };
template<typename T>
void g(T t) { f(t); }
static void f(A) { }
void f(B) { }
int main() { A a; g(a); }
Daha iyi f(A)
eşleşen dış bağlantı olmadığı için alınır.
Kütüphane değiştirir
Herhangi tanımlayıcıları kullanan geçerli C 2003 kod C standardı eklendi C 0x kütüphane veya Bu Uluslararası Standart, farklı sonuçlar derleme üretmek için başarısız olabilir.
#includes
C 0 x standart yeni kütüphane başlıkları adları ile başlıkları C 2003 kod geçerli bu Uluslararası Standart olarak geçersiz olabilir.
Derlenmiş C 2003 geçerli kodu
<algorithm>
olması bekleniyor takas yerine<utility>
dahil olabilir
Genel ad 32* *şimdi standardizasyon için ayrılmıştır.
Makroları
override
,final
,carries_dependency
, yanoreturn
tanımlar geçerli C 2003 C kodu 0x geçersiz.