Wieder einmal verlor ich einige Stunden wegen bloßer Dummheit, die der Compiler hätte erkennen können. Dies ist der Quellcode in Frage:
%Vor% Das Problem ist, dass ich versehentlich int
vor mVar
hinzugefügt habe. Wenn ich dies kompiliere mit: g++ -c -Wall -Wextra -Wshadow shadowtest.cpp
Ich bekomme keine Warnung, über die lokale mVar
shadowing das statische Mitglied mVar
.
Aber wenn ich die Membervariable nicht als statisch deklariere, gibt g ++ korrekt eine Warnung aus:
%Vor% kompilieren mit g++ -c -Wall -Wextra -Wshadow shadowtest2.cpp
bekommt:
Getestet mit g ++ 4.9.2 und 5.2.1.
Ist das richtiges Verhalten oder ein Fehler? Warum?
Bearbeiten: Ich habe hier einen Fehlerbericht eingereicht: Ссылка
Bearbeiten 2018-02-12: Warnt nicht in diesen Versionen:
%Vor%aber warnt erfolgreich:
%Vor%Bei der Beschreibung von -Whadow in der gcc-Dokumentation sieht das möglicherweise wie ein Fehler aus :
Warnen, wenn eine lokale Variable oder eine Typdeklaration eine andere Variable, einen anderen Parameter, einen Typ, ein Klassenmitglied (in C ++) oder eine Instanzvariable (in Objective-C) überschattet Immer wenn eine eingebaute Funktion beschattet wird. Beachten Sie, dass der Compiler in C ++ warnt, wenn eine lokale Variable einen expliziten typedef schattiert, aber nicht, wenn sie eine struct / class / enum schattiert.
Besonders in Anbetracht der Tatsache, dass der Clan für diesen Fall warnt. Dies ist im Grunde genommen ein Qualitätsproblem, da es sich hierbei nicht um schlecht formulierten Code handelt. Ich würde einen Fehlerbericht einreichen. Am wahrscheinlichsten werden sie eine Begründung dafür liefern, dass sie in diesem Fall nicht warnen oder sie werden die Warnungen schließlich korrigieren.
Es sieht so aus, als würde gcc vor diesem Fall warnen, wenn wir den ganzen Weg zurück zu Version 4.5.4 gehen live sehen .