SORU
13 Aralık 2010, PAZARTESİ


C 0x daralma dönüşümleri. Sadece bana mı öyle geliyor yoksa bu bir son dakika değişikliği gibi geliyor mu?

C 0x sözde gerektirdiğinden aşağıdaki kodu ve benzer kodu hatalı biçimlendirilmiş yapmak için gidiyordaralma dönüştürmeint double.

int a[] = { 1.0 };

Başlatma bu tür bir çok gerçek dünya kod kullanılıp kullanılmadığını merak ediyorum. Kaç kod bu değişiklik ile bozulur mu? Eğer kodunuzu etkilenen tüm kodunuzda bu düzeltmek için çok çaba mı?


Başvuru için, n3225 bu 8.5.4/6

Daraltma dönüştürmesi bir örtük dönüştürme

  • bir tamsayı türü için bir kayan nokta türü ya
  • uzun çift çift ya yüzer, ya da çift şamandıra dışında, kaynağı nerede bir sabit ifadesi ve gerçek değerini sonra dönüşüm aralığı içinde değerler gösterilebilir (bile olamaz temsil tam olarak), ya da
  • bir tamsayı türü veya unscoped numaralandırma türü için bir kayan nokta türü dışında, kaynağı nerede bir sabit ifadesi ve gerçek değerini sonra dönüşüm uyacak hedef türü ve vasiyet orijinal değeri geri dönüştürüldü özgün yazın ya
  • bir tamsayı türü veya unscoped numaralandırma türü için bir tamsayı türü olan temsil tüm değerler orijinal türü dışında, kaynağı nerede bir sabit ifadesi ve gerçek değerini sonra dönüşüm uyacak hedef türü ve vasiyet orijinal değeri geri dönüştürüldü özgün yazın.

CEVAP
14 Ocak 2011, Cuma


GCC kullandım ne zaman bir son dakika değişikliği ile karşılaştım. Derleyici böyle: kod için bir hata basılmış

void foo(const unsigned long long &i)
{
    unsigned int a[2] = {i & 0xFFFFFFFF, i >> 32};
}

void foo(const long long unsigned int&): işlevi

hata: unsigned int içinde long long unsigned int (((long long unsigned int)i) & 4294967295ull) daralma dönüşüm { }

hata: unsigned int içinde long long unsigned int (((long long unsigned int)i) >> 32) daralma dönüşüm { }

Neyse ki, hata iletileri basit ve düzeltme basitti:

void foo(const unsigned long long &i)
{
    unsigned int a[2] = {static_cast<unsigned int>(i & 0xFFFFFFFF),
            static_cast<unsigned int>(i >> 32)};
}

Kod tek bir dosyada sadece iki oluşumları ile harici bir kütüphane vardı. Kırılma değiştirmek çok kod etkileyeceğini sanmıyorum. Acemiler 15* confused, *ama olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfinityWard

    InfinityWard

    19 EYLÜL 2006
  • monkophile

    monkophile

    25 Temmuz 2007
  • RaverX DouBle StAg XI

    RaverX DouBl

    23 Mayıs 2008