Understanding -Weffc ++

8

Betrachten Sie das folgende Programm:

%Vor%

Dies wird, wenn es mit -Weffc++ auf GCC 4.7.1 kompiliert wurde, ausgespuckt:

%Vor%

Das ist normalerweise kein Problem, außer ein paar Dinge mit diesem Beispiel:

  1. Wenn ich den Konstruktor, die Zeigerdeklaration oder die Zeichenfolgedeklaration auskommentiere, wird die Warnung ausgeblendet. Das ist merkwürdig, weil man denkt, dass der Zeiger alleine ausreicht, aber nicht. Darüber hinaus bewirkt das Ändern der String-Deklaration in eine Integer-Deklaration, dass sie ebenfalls verschwindet, sodass sie nur dann angezeigt wird, wenn eine Zeichenfolge (oder wahrscheinlich andere auserlesene Klassen) darin enthalten ist. Warum verschwindet die Warnung unter diesen Umständen?

  2. Oft wird diese Warnung angezeigt, wenn der gesamte Zeiger auf eine vorhandene Variable zeigt (am häufigsten vom Betriebssystem verwaltet). Es gibt keine new und keine delete . Wenn die Klasse mit dem Handle in diesen Fällen kopiert wird, möchte ich keine tiefe Kopie. Ich möchte, dass beide Handles auf dasselbe interne Objekt zeigen (z. B. ein Fenster). Gibt es eine Möglichkeit, dies dem Compiler zu ermöglichen, ohne den Kopierkonstruktor und den Zuweisungsoperator unnötig zu überlasten oder die Warnung vollständig mit #pragma zu deaktivieren? Warum werde ich überhaupt belästigt, wenn die Dreiregel nicht einmal gilt?

chris 16.07.2012, 00:50
quelle

2 Antworten

4
  1. Wenn Sie es tun, haben Sie eine POD-Struktur. Da es keine Konstruktoren haben kann, überprüft -Weffc++ nicht.

  2. Verwenden Sie ein Referenz- oder shared_ptr -Objekt oder ein anderes Objekt, das einen Zeiger umschließt.

Arpegius 16.07.2012, 02:47
quelle
18

GCC -Weffc++ hat mehrere Probleme, ich benutze es nie. Der Code, der nach "Problemen" sucht, ist ziemlich einfach und daher sind die Warnungen viel zu unverblümt und wenig hilfreich.

Diese besondere Warnung basiert auf Punkt 11 der ersten Ausgabe von Effective C ++ und Scott hat es in späteren Ausgaben geändert (zum Besseren). Der G ++ - Code überprüft nicht die tatsächliche dynamische Zuweisung, sondern nur das Vorhandensein von Zeigerelementen.

Siehe, was ich über diese Warnung in GCC Bugzilla geschrieben habe, wenn ich die Richtlinien in die erste Ausgabe mit der dritten Ausgabe:

  
    

Punkt 11: Definieren Sie einen Kopierkonstruktor und einen Zuweisungsoperator für Klassen mit     dynamisch zugeordneter Speicher.

  
     

Ersetzt durch Punkt 14: "Denken Sie sorgfältig über Kopierverhalten in   Ressourcen-Management-Klassen "- der Rat ist weniger spezifisch, aber nützlicher. Ich bin   nicht sicher, wie man es in eine Warnung dennoch dreht!

    
Jonathan Wakely 17.07.2012 19:17
quelle