2016-08-06 90 views
0

nehme ich mehrere "h" Dateien haben:Wie eine Warnung geben, wenn h-Datei nicht enthalten ist, direkt

First.h

struct FirstStruct { /* Stuff */ }; 
/* Other stuff */ 

Second.h

#include "First.h" 
struct SecondStruct { 
    FirstStruct member; 
    /* More other stuff */ 
}; 
/* Even more other stuff */ 

Dritter. h:

#include "Second.h" 

FirstStruct foo(void); 
/* Other functions */ 

Wenn Siebemerkenerhält die Definition von FirstStruct nicht direkt (dh von First.h), sondern weil Second.h es für sie enthält. Das Problem ist, dass, wenn ein Entwickler entscheidet, dass SecondStruct nicht wirklich das FirstStruct dort braucht es die halb äquivalente Struktur OtherStruct, und dann nimmt das Include zu First.h ...... oops jetzt nichts mit Third.h nicht tut Arbeit.

Gibt es irgendeine Semi-Standard-Compiler-Option, um Sie zu warnen, wenn Sie sich auf einen anderen h-Dateien-Include verlassen müssen?

+1

(a) Suchen Sie nach IWYU - Include, was Sie verwenden. (b) Wenn Sie die Änderung vorgenommen haben, sollte es einen Test gegeben haben, bei dem das Kompilierungsproblem entdeckt wurde. Es gibt keinen einfachen Weg dahin. –

+0

Der Compiler wird sowieso "explodieren" ... weil die Deklaration für 'FirstStruct' in' Third.h' nicht ohne das '# include' gefunden wird. Mehrfache '#include <...>' sind nie ein Problem mit passenden Wachen. – WhiZTiM

+1

@WhiZTiM Es wird nur explodieren, wenn der Entwickler es nicht in der Second.h, es wird nicht einmal zurückschrecken, wenn ich es geben, was ich jetzt habe – DarthRubik

Antwort

2

Nun, wenn Sie Wachen Header haben, und der Kopfschutz für die Datei "First.h" ist FIRST_HEADER_H, Sie so etwas wie

#ifndef FIRST_HEADER_H 
/*warning*/ 
#pragma message("FREE ADVICE: You should include The file: First.h") 
#endif 

Haupt Compiler support dies tun könnte.

Auch ich denke, Sie auf dem self contained headers lesen sollten, die besagt, dass alle Dateien first.h (in diesem Beispiel) verwenden, sollten umfassen first.h so sollte third.h wahrscheinlich lesen geändert werden:

#include "First.h" 
#include "Second.h" 

FirstStruct foo(void); 
/* Other functions */ 
+0

Seltsam ... Aber es wird funktionieren ... Können Sie zur besseren Übersichtlichkeit Ihre Antwort auf einen * bearbeitbaren * Zustand ändern? Ich meine, füge potenziell funktionierenden Code hinzu – WhiZTiM

+0

Ich verstehe das nicht ..... könntest du es ausarbeiten? – DarthRubik

+0

@WhiZTiM Ich glaube nicht, dass ich wirklich verstehe, wie das funktioniert ...... wenn ich Second.h (und Header-Wächter hinzufügen) 'FIRST_HEADER_H' würde immer noch definiert werden (weil es definiert ist, wenn Sie Second.h einschließen) ..... so würde das nicht funktionieren (denke ich) – DarthRubik

0

Sie dies erkennen Szenario, indem Sie feststellen, dass Ihr Programm nicht mehr kompiliert.

Dann fügen Sie #include "First.h" in Third.h (wie Sie in erster Linie — ja getan haben sollten, auch wenn Sie Second.h auch ist einschließlich) und den Fehler auf Ihrem Issue-Tracking-System zu beheben.

Es gibt keine Compiler-Warnung, die Sie einschalten können, um anzuzeigen, dass dieses Problem eines Tages auftreten könnte. C++ Compiler erwarten sehr, dass einige Symbole nur durch die Header indirekt; Auch wenn es eine schlechte Übung ist, dies in Ihrem eigenen Code bewusst zu machen, würde eine solche Warnung die Kompilierung extrem verrauscht machen, wenn Sie irgendwelche Bibliotheken verwenden (einschließlich der Standardbibliothek).

Der einzige präventive Schritt, den Sie dann machen können, ist sorgfältige Code-Überprüfung unter Gleichaltrigen und eine Projektmanagementstruktur, die es ermöglicht, unerwartete Fehler zu beheben.

Zugegeben, das ist irgendwie nervig.

+0

Ich hatte gehofft für einen Weg, um das mögliche Problem * präemptiv * zu beheben – DarthRubik

+0

@DarthRubik: Peer review? :) –

+0

Möglicherweise hätte ich sagen sollen: "Ich hatte gehofft, dass ein Compiler-Schalter, ein Tool von Drittanbietern, ein Makro-Hack oder ein anderer automatisierter Prozess das mögliche Problem präventiv beheben könnte" – DarthRubik