SORU
18 HAZİRAN 2011, CUMARTESİ


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
19 HAZİRAN 2011, Pazar


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, ya noreturn tanımlar geçerli C 2003 C kodu 0x geçersiz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Creavite

    Creavite

    8 Mart 2009
  • dope2111

    dope2111

    29 HAZİRAN 2009
  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009

İLGİLİ SORU / CEVAPLAR