2012-01-18 18 views
6

Sorunu izleyin: g++ does not show a 'unused' warning.Kullanılmayan nesneleri bulma (ilkel olmayan değerler)

Neden g ++ bu değişkenler hakkında uyarı vermediğini tam olarak anlıyorum, ancak bir şekilde onları bir şekilde bulmak isterim. Üzerinde çalıştığım kodun bu özel durumlardan hiçbiri yok, bu yüzden tek bir FloatArray x; neredeyse kesinlikle kaldı.

Tek tek sınıfları işaretlemem gerekiyorsa (Kullanılmayan FloatArray nesneleri için uyarı gibi) çok yararlı olacaktır. Ne yapabilirim?

+0

Gerçekten bir problem mi? Bunu düşünmek çok zor çünkü çoğu derleyici muhtemelen nesneleri nesnelere sığdırmayacak ve sonra onları kullanamayacaklardır, değil mi? –

+0

Ancak derleyiciler, değişkenin “değil optimizasyondan önce” kullanılmadıklarını, sonra değil, bunu uyarırlar. Bu bir kabus olurdu! – rodrigo

cevap

1

Temel olarak, GCC'ye takılı bir çeşit basit statik analiz aracı oluşturmak ister misiniz? Eğer öyleyse, kullanılmayan bir değişken yazıcıyı hızlı bir şekilde uygulamak için MELT kullanarak başlayabilirsiniz. Bahse konu şeyler eksik ama gcc/g ++ istediğiniz ve hangi değil mi hangi uyarılar belirtmek için izin seçenekleri vardır ediyorsam

http://gcc.gnu.org/wiki/MELT%20tutorial

+0

Teşekkürler, ama "hızlı" hakkında emin değilim. Listelenen önkoşulları yerine getiremiyorum (yakın olmasa bile). Bunu zaten MELT'te yapmış birini bulabilir miyim görmeye çalışacağım. –

-1

emin değilim. Bu yüzden sadece -Wunused-değişkenini etkinleştirdik.

fazla bilgi için buraya bakınız: -Wall bu ve daha birçok kullanışlı uyarı dönecek Ayrıca

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html.

+2

Kullanılmayan değişken uyarısı, C++ sınıfları değil, yalnızca ilkel öğeler için çalışır; çünkü yapıcı/yıkıcı istenen bir etkiye sahip olabilir. – greg

+1

Üzgünüz, ama -1 çünkü aslında bunun neden işe yaramadığını açıklayan soruya bağlanıyorum. –

+0

yeterince adil. Bir gün, okumayı öğreneceğim. – Liam

3

Eh, GCC ile aşağıdaki kod istediğiniz gibi uyarmak kapsamaz:

struct Foo 
{ 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //warning: unused variable 'b' 
} 

Ama Foo veya Bar yapı, hatta önemsiz bir birine bir yapıcı/yıkıcı eklerseniz, bu uyarmak olmaz. Şimdi ekstra kullanılmayan değişkenler için kontrol etmek g++ -DTEST_UNUSED ile derlemek

struct Foo 
{ 
#ifndef TEST_UNUSED 
    Foo() {} 
#endif 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //warning! 
} 

:

struct Foo 
{ 
    Foo() {} 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //no warning! It calls Foo::Foo() into b.f 
} 

Yani uyarıyı yeniden sağlamanın en kolay yolu tüm ilgili kurucular VE yıkıcı şartlı derlemek etmektir.

En parlak fikrim değil, ama işe yarıyor.

+2

Bu, kullanıcı tarafından oluşturulan nesneler için kullanılabilir, ancak dil tarafından sağlananlar için kullanılamaz (dize, STL kapsayıcılar, vb.). – greg

+0

Bu, muhtemelen, projede kullanılmayan nesnelerin önemli bir miktarını bulmama izin verecek, bu yüzden size ödül vereyim. –

İlgili konular