Lors du codage en C ou C ++, où dois-je avoir les #include
's?
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));
...
Toutes les inclusions devraient-elles être dans le .h ou .c / .cpp, ou les deux comme je l'ai fait ici?
Réponses:
Mettez autant que vous le pouvez dans le
.c
et le moins possible dans le.h
. Les inclus dans le.c
ne sont inclus que lorsque ce fichier est compilé, mais les inclus pour le.h
doivent être inclus par chaque fichier qui l'utilise.la source
#ifndef _CALLBACK_H_
, en plus, n'empêche pas le compilateur de le traiter plusieurs fois?.h
est d'éviter dans certains cas une erreur due à une boucle d'inclusion. Exemple: deux classes ont besoin l'une de l'autre pour leurs implémentations, mais pas pour leurs déclarations. Mettre les deux inclus dans le.cpp
s évitera une erreur.Le seul moment où vous devez inclure un en-tête dans un autre fichier .h est si vous devez accéder à une définition de type dans cet en-tête; par exemple:
Si l'en-tête A dépend de l'en-tête B tel que l'exemple ci-dessus, alors l'en-tête A doit inclure l'en-tête B directement. N'essayez PAS de classer vos inclusions dans le fichier .c pour satisfaire les dépendances (c'est-à-dire, y compris l'en-tête B avant l'en-tête A); c'est un gros tas de brûlures d'estomac qui attendent de se produire. Je suis sérieux. J'ai été dans ce film plusieurs fois et ça s'est toujours terminé avec Tokyo en flammes.
Oui, cela peut entraîner des fichiers inclus plusieurs fois, mais s'ils ont des protections d'inclusion appropriées configurées pour se protéger contre plusieurs erreurs de déclaration / définition, alors quelques secondes supplémentaires de temps de construction ne valent pas la peine de s'inquiéter. Essayer de gérer manuellement les dépendances est une douleur dans le cul.
Bien sûr, vous ne devriez pas inclure de fichiers là où vous n'en avez pas besoin .
la source
Mettez autant d'includes que possible dans votre cpp et uniquement celles qui sont nécessaires au fichier hpp dans le fichier hpp. Je pense que cela aidera à accélérer la compilation, car les fichiers hpp seront moins référencés.
Pensez également à utiliser des déclarations directes dans votre fichier hpp pour réduire davantage la chaîne de dépendances d'inclusion.
la source
Si je
#include <callback.h>
, je ne veux pas avoir à#include
beaucoup d'autres fichiers d'en-tête pour obtenir mon code à compiler. Encallback.h
vous devriez inclure tout le nécessaire pour compiler contre. Mais rien de plus.Déterminez si l'utilisation de déclarations directes dans votre fichier d'en-tête (comme
class GtkButton;
) suffira, vous permettant de réduire le nombre de#include
directives dans l'en-tête (et, par conséquent, mon temps de compilation et ma complexité).la source