153 votes

#include in .h ou .c / .cpp?

Lors du codage en C ou C ++, où devrais-je avoir les #include ?

callback.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
 

callback.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));

  ...
 

Est-ce que tous les inclus doivent être dans le .h ou le .c / .cpp, ou les deux comme je l’ai fait ici?

205voto

Brendan Long Points 24372

Mettez autant que vous le pouvez dans les .c et le moins possible dans les .h . Les inclus dans les .c ne sont inclus que lorsque ce fichier est compilé, mais les inclus pour les .h doivent être inclus par chaque fichier qui les utilise.

68voto

John Bode Points 33046

Le seul moment où vous devriez inclure un en-tête dans l'autre .h fichier si vous avez besoin d'accéder à une définition de type qui en-tête; par exemple:

#ifndef MY_HEADER_H
#define MY_HEADER_H

#include <stdio.h>

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

#endif

Si Un en-tête dépend de l'en-tête B comme dans l'exemple ci-dessus, puis d'en-tête doit inclure l'en-tête B directement. Ne PAS essayer de le commander votre inclut les dans les .c fichier pour satisfaire les dépendances (qui est, y compris en-tête B avant Un en-tête); c'est un grand ol' tas de brûlures d'estomac en attente de se produire. Je veux dire, c'. J'ai été dans ce film plusieurs fois, et ça finissait toujours avec Tokyo dans les flammes.

Oui, cela peut entraîner dans les fichiers inclus plusieurs fois, mais si ils ont l'comprenant des protections mises en place pour protéger contre les multiples déclaration/définition des erreurs, puis un supplément de quelques secondes de temps de construction n'est pas la peine de s'inquiéter au sujet de. En essayant de gérer les dépendances à la main est une douleur dans le cul.

Bien sûr, vous ne devriez pas être compris des fichiers où vous n'avez pas besoin d'.

19voto

Parappa Points 4835

Mettez autant d'inclusions que possible dans votre cpp et uniquement celles dont le fichier hpp a besoin dans hpp. Je crois que cela aidera à accélérer la compilation, car les fichiers hpp seront moins référencés.

Pensez également à utiliser des déclarations en aval dans votre fichier hpp pour réduire davantage la chaîne de dépendance include.

6voto

Johnsyweb Points 45395

Si je #include <callback.h> , je ne veux pas avoir à #include beaucoup d'autres fichiers d'en-tête pour que mon code soit compilé. Dans callback.h vous devez inclure tout ce qui est nécessaire pour la compilation. Mais rien de plus.

Déterminez si l’utilisation de déclarations anticipées dans votre fichier d’en-tête (telle que class GtkButton; ) suffira, ce qui vous permettra de réduire le nombre de directives #include dans l’en-tête (et, à mon tour, mon temps de compilation). et complexité).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X