2015-11-16 20 views
9

Bir kez daha derleyici tarafından tanınan aptallık yüzünden bir kaç saatimi kaybettim.G ++ -Wshadow, statik üye gölgelemesi hakkında uyarı vermiyor

class f { 
    static int mVar; 
    int g(int x) { int mVar=3; return x+mVar; } 
}; 
int f::mVar = 1; 

sorun ben yanlışlıkla mVar önünde int eklendi olmasındandır: Bu söz konusu kaynak kodudur. Bunu şu şekilde derlediğimde: mVar yerel üyesi hakkında mVar statik üyesini gölgeleyen hiçbir uyarı alamıyorum. alır

class f { 
    int mVar; 
    f(int rVar) : mVar(rVar) {}; 
    int g(int x) { int mVar=3; return x+mVar; } 
}; 

g++ -c -Wall -Wextra -Wshadow shadowtest2.cpp ile derlemek:

shadowtest2.cpp:5:24: warning: declaration of ‘mVar’ shadows a member of ‘f’ [-Wshadow] 
    int g(int x) { int mVar=3; return x+mVar; } 
         ^
shadowtest2.cpp:3:9: note: shadowed declaration is here 
    int mVar; 
     ^

g ++ 4.9.2 ile test edilmiştir Ben statik olmaya üye değişkeni beyan yoksa

, o zaman g ++ doğru bir uyarı verir ve 5.2.1.

Bu doğru davranış veya hata mı? Niye ya?

Düzenleme: Burada bir hata raporu açtı: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68374

Düzenleme 2018/02/12: Bu sürümlerinde uyarmak yok:

g++-4.9 (Debian 4.9.4-2) 4.9.4 
g++-5 (Debian 5.4.1-4) 5.4.1 20161202 
g++-5 (Debian 5.5.0-8) 5.5.0 20171010 
g++-6 (Debian 6.3.0-18) 6.3.0 20170516 
g++-6 (Debian 6.4.0-12) 6.4.0 2018
g++-7 (Debian 7.2.0-16) 7.2.0 
g++-7 (Debian 7.3.0-3) 7.3.0 

ama başarıyla uyarıyor:

g++-8 (Debian 8-20180207-2) 8.0.1 20180207 (experimental) [trunk revision 257435] 
+0

Clang uyarır. http://coliru.stacked-crooked.com/a/00a4eea04a1c5900 –

+0

bir hata, doğru kodun reddedildiği veya yasa dışı kodun kabul edildiği anlamına gelir. Sorununuz yalnızca rahatsızlık vericidir. –

+3

@ engf-010 Bir hata, belgelenen davranıştan farklı olan her davranıştır. Öyleyse eğer -Wshadow'un bunun hakkında uyarması gerekiyorsa ve öyle değilse, bu bir hatadır. Bir derleyici, bu günlerde yalnızca C++ standardına uymaktan fazlasını yapar. –

cevap

3

Bu, potansiyel olarak -Wshadow in the gcc documentation:

açıklaması verilen bir hata gibi görünüyor. Yerel bir değişken ya da tür bildirimi (C++) bir değişken parametre, tür, sınıf üyesi gölgeler veya örneğin değişken (amaç-C) ya da her bir dahili işlev gölgelendiği her

uyar. C++ 'da, derleyici, yerel bir değişken açık bir typedef gölgelendirir, ancak bir struct/class/enum gölgesi varsa uyarır. Özellikle bu durumun bu dava için uyardığı düşünülürse. Bu, temel olarak biçimlendirilmiş bir kod olmadığı için temel olarak bir uygulama sorunu niteliğindedir. a bug report dosyasını kaydederim. Büyük ihtimalle bu durumda uyarı vermemek için bir gerekçe sunacaklar ya da eninde sonunda uyarıları düzeltebilecekler.

Gcc, 4.5.4 see it live sürümüne geri gidersek, bu durumu uyarmak için kullanılır.

+0

Teşekkür ederim, sık sık clang kullanmıyorum, bu yüzden ona bakmayı düşünmedim. Ama bu bana bir böcek olarak dosyayı yazmam için yeterli sebep verdi. – mxmlnkn

+0

@xyzdragon huh, bu yüzden geri dönmek için yeterince gcc gidiyoruz bu durumda hakkında uyarmak için kullanılır. Neden değiştiğini merak ediyorum. –

+0

Birisi (OP sanırım) dosyaladı. https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 68374 –

İlgili konular