2010-01-18 21 views
6

Eski c/C++ kodunun, kodlar yerine tamsayılar yerine tamsayı kullanıldıkları yerde temizlenmesi, işlev bildiriminin düzgün bir şekilde yeniden yapılandırıldığı, ancak gövdenin olmadığı yerleri bulmak sıkıcıdır. Örneğin.Herhangi bir c/C++ derleyici var mı (veya hata veren) veya int dönüştürebilirsiniz?

enum important { 
    little = 1, 
    abit = 2, 
    much = 3 
}; 

void blah(int e) 
{ 
    // magic stuff here 
} 

void boing(int e) { ... } 

void guck(important e) 
{ 
    switch (e) { 
    case 3: // this would be a good place for a warning 
     blah(e); // and this 
     break; 
    default: 
     boing((int)e); // but this is OK (although imperfect and a warning would be acceptable) 
     break; 
    } 
} 

Açıklama Ekleme/her numaralama tip modifiye ya da orada çok çok sayıda farklı enums, bu nedenle bu durum tercih edilmez, ancak kabul edilebilir bir çözüm olabilir olarak onları aynı zamanda iş adil bir miktar olacaktır kodu içinde arama.

Ana derleyicilerden veya diğer araçlardan (gcc çoğunlukla) veya platformdan (çoğuda) bulunmak için ona ihtiyacım yok, bunu elle birkaç kez çalıştırabilirim, ancak bu bir şey değil çok ezoterik veya pahalı.

+0

gcc bunu mükemmel şekilde ele almıyor mu? G ++ kullanıyorum ve her zaman açıklanan uyarıları görüyorum. Saf C derleyicisi farklı davranır mı? – Basilevs

+0

Hayır, bu kodu derleyerek (eksi ... ve artı boş bir ana()): g ++ -Wall test.cpp 0 uyarı verir. Int'ten enum'a terfi etmek için uyarılır, ancak başka şekilde değil. Başka şekilde çalışıyorsanız, lütfen bana komut satırınızı verin. lütfen ... –

cevap

1

tiftik size bu uyarıyı sağlayacaktır (koşul 641) int enum dönüştürme

641 - Bir numaralandırma türü, bir aritmetik operatör ya da bir bağımsız değişken olarak bir hesaplama gerekli bir kapsamda kullanılmıştır İntegral bir argümana kıyasla idi. Eğer numaralandırma tamsayı modelini kullanırsanız (+ fie) bu uyarı bastırılır, ancak bunu yaparken değerli tip kontrolünü kaybedersiniz. Bir ara politika bu uyarısını basitçe kapatmaktır. Enum için int atama hala yakalanacaktır.

Atel (http://www.splint.org/download.html) bundan biraz size yardımcı olabilir

+0

evet, daha küçük c kısmı için, ne yazık ki biz C++ tarzı yorumlar bu yüzden hemen spalint pukes var, sanırım bunları uzaklaştırabilirim. Herhangi bir OK C++ yeteneğini veya lint'i görmezden gelerek kiralamayı biliyor musunuz? –

1

Sparse (Linux kernel insanlar tarafından kullanılan bir semantik denetleyicisi aracı) kullanabilir modern bir tiftik olduğunu.

Enum hatalarının bir alt kümesi şu seçenekler tarafından yakalanabilir: -Wenum-uyumsuz, -Wcast-truncate. Ancak, kodunuzu bunun üzerinden koştum ve bunlardan herhangi biri yakalanmış gibi görünmüyor.

Bu, uzatmak istediğiniz takdirde Ücretsiz bir yazılımdır.

İlgili konular