SORU
15 Ocak 2015, PERŞEMBE


C-derleme örtülü bir hata/uyarı-sonbahar anahtarı Güç

4* *ifadeleri süper yararlı olabilir, ancak bir programcı break ifadesini unuttum ortak bir hata neden:

switch(val) {
    case 0:
        foo();
        break;
    case 1:
        bar();
        // oops
    case 2:
        baz();
        break;
    default:
        roomba();
}

Bazen düşmek açıkçası bu yana bir uyarı açıkça istenen alamazsın. Kodlama tarzı ile düştüğünde yorum yapmayı öneriyor iyi bir gerekliliktir, ama bazen bu yeterli değildir.

Eminim bu sorunun cevabını hayır, ama orada herhangi bir şekilde şu anda (ya da önerilen geleceği) sor derleyici atmak için bir hata (ya da en azından bir uyarı!) eğer case break; en az bir veya // fallthru etkisi için bir şey var mı? switch ifadeleri kullanarak defansif bir programlama seçeneği olması güzel olurdu.

CEVAP
15 Ocak 2015, PERŞEMBE


İyi çınlama var haberim yoktu ama -Weverything kullanarak bulundu -Wimplicit-fallthrough. Bu kod için bana aşağıdaki uyarıyı verirsee it live):

warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough]
case 2:
^
note: insert '[[clang::fallthrough]];' to silence this warning
case 2:
^
[[clang::fallthrough]]; 
note: insert 'break;' to avoid fall-through
case 2:
^
break; 

Bu bayrak için bulabildiğim tek belge diyor ki: Attribute Reference

Çınlama::fallthrough öznitelik ile birlikte kullanılır -Wimplicit-fallthrough kasıtlı açıklama için argüman düşmek anahtarı etiketler arasında. Sadece boş bir ifade için uygulanabilir herhangi bir deyimi yürütme arasında bir noktada yerleştirilmiş ve ertesi etiket anahtarı. Ortak bir özel ile bu yerleri işaretlemek için. yorum, ama bu niteliğiyle yorum yerini almak anlamına bir daha derleyici tarafından kontrol edilebilen katı açıklama,.

ve işaretlemek için bir örnek sağlar fall-through: açık

case 44:  // warning: unannotated fall-through
g();
[[clang::fallthrough]];
case 55:  // no warning

Mark açık attribute bu taşınabilir olmama dezavantajı var-üzerine düşebilir. Visual Studio bir hata oluşturabilir ve gcc aşağıdaki uyarı oluşturur:

warning: attributes at the beginning of statement are ignored [-Wattributes]

eğer -Werror kullanmak istiyorsanız bir sorundur.

gcc 4.9 ile bunu denedim ve gcc bu uyarı desteklemiyor gibi görünüyor:

hata: '- Wimplicit-fallthrough' . tanınmayan komut satırı seçeneği

gcc Hata Bug 7652 - -Wswitch-break : Warn if a switch case falls through gcc Bu çabayı kapsar ve aslında clang bu özelliği destekleyen notlar rapor.

Visual Studio için böyle bir uyarı çıkartan bir yol göremiyorum.

Not Chandler Carruth -Weverything üretim kullanım için açıklıyor:

Bu kelimenin tam anlamıyla Çınlama her uyarı sağlayan deli bir grup. Kodunuzu bu kullanım yok. Kesinlikle Çınlama için tasarlanmıştır geliştiriciler ya da uyarılar var ne keşfetmek için.

ama uyarılar var ne bulmaktan için yararlıdır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • Creavite

    Creavite

    8 Mart 2009
  • ImBluecams

    ImBluecams

    25 Kasım 2012