Warnung zum Aufruf von statischen Methoden über Instanzobjekt in C ++

8

Ich weiß, dass das Aufrufen der statischen Methode über das Instanzobjekt ausdrücklich erlaubt ist .

Aber wenn ich es manuell vermeiden möchte, wie kann ich gewarnt werden, wenn der Anruf passiert? Ich meine, gibt es einige Compiler-Optionen (oder einige spezielle Attribute), um die Situation zu überprüfen?

Ich benutze Clang, aber auch andere kompilerspezifische Funktionen sind willkommen.

    
Eonil 20.05.2014, 09:51
quelle

2 Antworten

5

Die Antwort ist einfach nein. Wie in den anderen Q & amp; A, der Standard erfordert und erlaubt dieses Verhalten. Siehe n3797 s9.4 / 2:

  

Auf ein statisches Member s der Klasse X kann unter Verwendung des qualifizierten ID-Ausdrucks X :: s Bezug genommen werden; Es ist nicht erforderlich, die Zugriffssyntax des Klassenmembers (5.2.5) zu verwenden, um auf einen statischen Member zu verweisen. Auf ein statisches Member kann mit der Zugriffssyntax des Klassenmembers verwiesen werden. In diesem Fall wird der Objektausdruck ausgewertet.

Angesichts dieser stumpfen Sprache, wie würde ein Compiler tun, was Sie fragen?

Vielleicht sollten Sie stattdessen nach einer Version von Lint suchen. Ich habe Ссылка und den Fehler 1705 gefunden, der möglicherweise das ist, was Sie wollen, und ich bin mir sicher, dass es andere gibt.

Also die Frage ist, warum Lint, anstelle des Compilers. Hier gibt es Graustufen, aber ich denke, Compilerwarnungen sind im Allgemeinen Dingen vorbehalten, die tatsächlich falsch sind oder sein könnten. Sie können ein nicht definiertes Verhalten oder eine definierte Implementierung sein oder Orte, an denen der Compiler etwas anderes tut als erwartet. Das Aufrufen einer statischen Methode über einen Zeiger gehört nicht zu dieser Kategorie. Es ist absolut eine Anforderung des Standards und erzeugt genau den Code, den Sie erwarten würden.

Compiler sind nicht für die Durchsetzung von Codierungsstandards gedacht, dafür gibt es andere Tools. In der C / C ++ - Unix-Welt gibt es historisch gesehen die Möglichkeit, Verstöße gegen Codierungsstandards zu erkennen und zu beschweren, nicht den Compiler. In der .Net-Welt war es FxCop, obwohl Visual Studio jetzt die gleichen Dinge macht. Wenn Sie möchten, dass Ihr Code bestimmte Standards erfüllt, suchen Sie nach einem Tool, das statische Code-Analysen durchführt, wie z. B. hier .

Wenn dies Ihre Frage nicht beantwortet, möchten Sie vielleicht eine andere Frage stellen. Soweit ich weiß, bin ich zuversichtlich, dass ein Compiler das Richtige tut, indem er den Standard implementiert und keine Warnung ausgibt.

    
david.pfx 20.05.2014 23:31
quelle
1

Mit CppDepend und CQlinq können Sie feststellen, wo alle statischen Methoden aufgerufen werden, und nach der Überprüfung manuell

zum Beispiel können Sie die folgende Abfrage ausführen:

    
quelle

Tags und Links