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]
Clang uyarır. http://coliru.stacked-crooked.com/a/00a4eea04a1c5900 –
bir hata, doğru kodun reddedildiği veya yasa dışı kodun kabul edildiği anlamına gelir. Sorununuz yalnızca rahatsızlık vericidir. –
@ 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. –