#einschließen in .h oder .c / .cpp?

Lesezeit: 5 Minuten

Wo sollte ich beim Codieren in C oder C++ die #include‘s?

Rückruf.h:

#ifndef _CALLBACK_H_
#define _CALLBACK_H_

#include <sndfile.h>
#include "main.h"

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data);
void on_button_cancel_clicked(GtkButton* button, struct user_data_s* data);

#endif

Rückruf.c:

#include <stdlib.h>
#include <math.h>

#include "config.h"

#include "callback.h"
#include "play.h"

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data) {
  gint page;
  page = gtk_notebook_get_current_page(GTK_NOTEBOOK(data->notebook));

  ...

Sollten alle Includes entweder in .h oder .c / .cpp enthalten sein, oder in beiden, wie ich es hier getan habe?

  • Lassen Sie mich das umdrehen und fragen: was war dein Kriterien für die Entscheidung, sndfile.h und main.h in callback.h einzufügen?

    – Owen S.

    8. Juni 2010 um 23:38 Uhr

  • für alle anderen, die an mehr Details interessiert sind, gibt es Dies.

    – Diego Rodríguez

    29. März 2021 um 21:04 Uhr

Legen Sie so viel wie möglich in die .c und so wenig wie möglich in der .h. Die beinhaltet in der .c werden nur eingeschlossen, wenn diese eine Datei kompiliert wird, aber die Includes für die .h müssen in jeder Datei enthalten sein, die sie verwendet.

  • Stimmt, aber nicht #ifndef _CALLBACK_H_oben drauf, den Compiler daran hindern, es mehr als einmal zu verarbeiten?

    – Hydromo

    8. Februar 2014 um 12:25 Uhr

  • @ user9379 Dadurch wird verhindert, dass es mehr als einmal pro .c- oder .cpp-Datei enthalten ist. Jede .c- oder .cpp-Datei wird jedoch im Allgemeinen einzeln erstellt, was bedeutet, dass eine .h-Datei für jede .c- oder .cpp-Datei, die Sie kompilieren, erneut analysiert wird.

    – Brendan Lang

    9. Februar 2014 um 0:29 Uhr

  • Ich denke, dass der Hauptgrund dafür ist, so wenig wie möglich in die zu stecken .h soll in einigen Fällen einen Fehler aufgrund einer Inklusionsschleife vermeiden. Beispiel: Zwei Klassen brauchen einander für ihre Implementierungen, aber nicht für ihre Deklarationen. Setzen Sie beides in die ein .cpps vermeidet einen Fehler.

    – Kodoskop

    9. Januar 2017 um 20:09 Uhr


  • @Qu’est-cet’yont Das ist ein Grund, warum du kippen Legen Sie bestimmte Dinge in die .h-Dateien. In dieser Antwort geht es darum, warum Sie noch weniger als das setzen sollten.

    – Brendan Lange

    9. Januar 2017 um 20:50 Uhr

  • @BrendanLong Ich verstehe, obwohl es in meinem Sinne keine Rolle spielt, denselben Header mehrmals einzufügen, wenn Sie die richtigen Makros einfügen, um den Inhalt nur einmal einzuschließen. Daher denke ich, dass das Setzen von noch weniger die Wahrscheinlichkeit verringert, in Zukunft bei Änderungen des Codes einen Fehler zu bekommen.

    – Kodoskop

    9. Januar 2017 um 22:21 Uhr

Sie sollten einen Header nur dann in eine andere .h-Datei einfügen, wenn Sie auf eine Typdefinition in diesem Header zugreifen müssen. zum Beispiel:

#ifndef MY_HEADER_H
#define MY_HEADER_H

#include <stdio.h>

void doStuffWith(FILE *f); // need the definition of FILE from stdio.h

#endif

Wenn Header A wie im obigen Beispiel von Header B abhängt, sollte Header A Header B direkt enthalten. Tun NICHT Versuchen Sie, Ihre Includes in der .c-Datei so anzuordnen, dass sie Abhängigkeiten erfüllen (dh Header B vor Header A einfügen); das ist ein großer alter Haufen Sodbrennen, der darauf wartet, passiert zu werden. Ich meine es so. Ich war mehrere Male in diesem Film und er endete immer damit, dass Tokio in Flammen aufging.

Ja, dies kann dazu führen, dass Dateien mehrmals eingebunden werden, aber wenn sie über ordnungsgemäße Include-Wächter verfügen, die zum Schutz vor mehreren Deklarations-/Definitionsfehlern eingerichtet sind, dann lohnt es sich nicht, sich über ein paar zusätzliche Sekunden Build-Zeit Sorgen zu machen. Der Versuch, Abhängigkeiten manuell zu verwalten, ist ein Ärgernis.

Natürlich sollten Sie keine Dateien einschließen, wo dies nicht der Fall ist brauchen zu.

  • Warum nicht einfach die deklarierte Datei weiterleiten class File; und schließen Sie stdio in .cpp ein, wo doStuffWith definiert?

    – Oleksa

    3. September 2020 um 17:27 Uhr


  • @olekstolar: In diesem speziellen Fall wird das nicht funktionieren, weil FILE ist ein Typedef-Name, kein Klassenname. Das brauchen wir typedef xxx FILE; Definition von stdio.h. In anderen Fällen ja, können Sie unvollständige Typen wie weiterleiten struct foo; oder class bar; und die Header-Datei nicht enthalten, aber jetzt haben Sie Ihren Wartungsaufwand erhöht. Sie müssen Ihre Forward-Deklarationen mit dem Inhalt der Header-Datei synchron halten – es ist einfach einfacher, die Header-Datei einzufügen. Nein, die Typen rein stdio.h werden sich wahrscheinlich nicht ändern, aber in benutzerdefinierten Headern können sie sich stark ändern.

    – Johannes Bode

    3. September 2020 um 18:38 Uhr

Fügen Sie so viele Includes wie möglich in Ihre cpp ein und nur die, die von der hpp-Datei in der hpp benötigt werden. Ich glaube, dass dies dazu beitragen wird, die Kompilierung zu beschleunigen, da hpp-Dateien weniger Querverweise aufweisen.

Erwägen Sie auch die Verwendung Erklärungen weiterleiten in Ihrer hpp-Datei, um die Include-Abhängigkeitskette weiter zu reduzieren.

  • Uh. Die Sache mit den Vorwärtsdeklarationen ist interessant.

    – Brendan Lange

    9. Juni 2010 um 0:18 Uhr

  • Parappa, Forward-Deklarationen sind in zirkulären Referenzszenarien sehr nützlich. Aber wären sie in anderen Szenarien eine gute Praxis? (Ich bin neu in C++, also frage ich ehrlich)

    – Dzyann

    20. November 2013 um 20:25 Uhr

Wenn ich #include <callback.h>ich will nicht müssen #include viele andere Header-Dateien, um meinen Code zum Kompilieren zu bringen. Im callback.h Sie sollten alles enthalten, was zum Kompilieren benötigt wird. Aber nichts weiter.

Überlegen Sie, ob Sie Forward-Deklarationen in Ihrer Header-Datei verwenden (z class GtkButton;) ausreichen, sodass Sie die Anzahl reduzieren können #include Direktiven im Header (und damit meine Kompilierzeit und Komplexität).

Kann man dann nicht einfach eine All.h in das Projekt einbauen, die alle benötigten Header enthält, und jede andere .h-Datei ruft All.h auf und jede .c/.cpp-Datei enthält nur ihren eigenen Header?

1423860cookie-check#einschließen in .h oder .c / .cpp?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy