2016-10-15 4 views
2

So verwenden wir #include, um dem Compiler/Linker mitzuteilen, wo der relevante Code für eine Klasse zu finden ist.Putting enthält an den richtigen Stellen

Werfen Sie einen Blick auf diese:

ClassC.h: 
    #include "ClassA.h"; 

ClassD.h: 
    #include "ClassC.h" 

die wir verwenden ClassA in unserem ClassD Lassen Sie sagen, aber in einer Weise, die in keiner Weise zu ClassC verbunden ist. Wir haben es implizit eingeschlossen, indem wir ClassC einschließen, also wird kein Fehler geworfen. Sollte sich der Code jedoch ändern und ClassC wird nicht mehr benötigt (und wir entfernen die #include "ClassC.h" aus diesem Grund), erhalten wir undefinierte Referenzfehler, da ClassA jetzt nicht referenziert ist.

Gibt es eine Möglichkeit, den Compiler/Linker jedes der * .cpp und zugewiesenen * .h unabhängig betrachten zu lassen, ohne in enthaltene .h-Dateien zu schauen?

Wenn das der Fall wäre, würde es nicht in ClassC.h schauen und sehen, dass es ClassA.h enthält, aber einen Fehler oder zumindest eine Warnung, die mir sagt, dass ich ClassA.h nicht eingeschlossen habe. Dies ist sinnvoller, da die Klassen ClassD, ClassA und ClassC keine Verbindung miteinander haben (unter der eingestellten Annahme verwende ich ClassA unabhängig von ClassC).

Ich denke, dass der so geschriebene Code viel stabiler und widerstandsfähiger zu ändern wäre. Wäre es nicht?

Lassen Sie uns auch sagen, wir bauen ein Projekt, und es funktioniert. Wenn wir eine Klasse (X) früher im Code referenzieren sollten, als zuvor referenziert, erhalten wir möglicherweise einen Fehler, wenn sie eine andere Klasse (Y) verwendet, die von einer anderen Quelle zwischen diesem Punkt im Programm enthalten war, und das vorherige erste Auftreten dieser Klasse. Wenn wir eine engere Verknüpfung mit jeder Header-Datei herstellen, die sie explizit verwendet, werden solche Fehler niemals angezeigt.

Ich weiß, dass ich das alles selbst behalten kann, aber es wäre so einfach, ein paar oder mehr in größeren Projekten zu übersehen, sogar in mittleren. Außerdem wäre es viel einfacher, einen Fehler/eine Warnung zu haben.

Ich weiß, ich verkompliziere die Dinge ein wenig, aber das scheint mir eine gute Übung.

Es ist sogar eine gute Idee und kann es irgendwie in Compiler/Linker-Optionen (z. B. GNU GCC-Compiler in CodeBlocks) gesetzt werden?

+1

Sie sollten die Wächter einschließen. https: //en.wikipedia.org/wiki/Include_guard – Gavin

+0

Include Guards sind großartig und verhindern, dass Sie die gleichen zwei Dinge in ein Projekt einbeziehen, ich weiß. Ich möchte etwas in meinen Code an 10 verschiedenen Stellen einfügen können, obwohl der Compiler/Linker nur den ersten benutzt. – Karlovsky120

+0

Ich verstehe weder, welches Problem Sie versuchen zu lösen, noch die Lösung, die Sie vorschlagen – user463035818

Antwort

1

Lassen Sie uns sagen, dass wir KlasseA in unserem ClassD verwenden, aber in einer Weise, die zu ClassC verbunden ist in keiner Weise. Wir haben es implizit mit einbezogen, indem wir ClassC mit einschließen, also wird kein Fehler geworfen. Sollte sich der Code jedoch ändern und ClassC wird nicht mehr benötigt (und wir entfernen das # include "ClassC.h" aus diesem Grund), erhalten wir undefinierte Referenzfehler, da ClassA jetzt nicht referenziert ist.

Wenn Sie ClassA in Ihrem ClassD, dann ausdrücklich#include "ClassA.h" in Ihrem ClassD.h verwenden müssen. Do nicht verlassen auf implizit Ketten von Einschlüssen.

+0

Ich möchte das tun. Ich möchte nur wissen, ob es eine Möglichkeit für den Compiler gibt, die Überprüfung für mich durchzuführen. – Karlovsky120

+0

@ Karlovsky120: An diesem Punkt weiß ich nicht, was Sie genau meinen. Der Compiler hat keine psychischen Fähigkeiten zu erraten, welche Header Sie wollen. Wenn Sie die erforderlichen Header nicht angeben, erhalten Sie Compiler- oder Linkfehler. –

+0

Ich meinte hauptsächlich, wenn der Compiler/Linker erkennen kann, ob include explizit oder implizit war, und eine Warnung in dieses werfen, war ein implizites Include. Es könnte schwierig sein, dies zu tun, da einige implizite Includes (z. B. solche, die von der Elternklasse übernommen wurden) in Ordnung wären, da sie immer vorhanden wären. – Karlovsky120

Verwandte Themen