Al codificar en C o C ++, ¿dónde debería tener los #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));
...
¿Deberían todas las inclusiones estar en .ho .c / .cpp, o en ambos como lo he hecho aquí?
Respuestas:
Ponga tanto como pueda en el
.c
y lo menos posible en el.h
. Las inclusiones en el.c
solo se incluyen cuando ese archivo está compilado, pero las inclusiones para el.h
deben ser incluidas por cada archivo que lo use.fuente
#ifndef _CALLBACK_H_
impide que el compilador lo procese más de una vez?.h
es para evitar en algunos casos un error debido a un ciclo de inclusión. Ejemplo: dos clases se necesitan entre sí para sus implementaciones, pero no para sus declaraciones. Poner ambas inclusiones en la.cpp
s evitará un error.La única vez que debe incluir un encabezado dentro de otro archivo .h es si necesita acceder a una definición de tipo en ese encabezado; por ejemplo:
Si el encabezado A depende del encabezado B, como en el ejemplo anterior, entonces el encabezado A debe incluir el encabezado B directamente. No NO tratar de ordenar su incluye en el archivo .c para satisfacer las dependencias (es decir, incluyendo la cabecera B antes de cabecera A); eso es un montón de ardor de estómago esperando suceder. Lo digo en serio. He estado en esa película varias veces y siempre terminaba con Tokio en llamas.
Sí, esto puede resultar en que los archivos se incluyan varias veces, pero si tienen protecciones de inclusión adecuadas configuradas para proteger contra múltiples errores de declaración / definición, entonces no vale la pena preocuparse por unos segundos adicionales de tiempo de compilación. Tratar de gestionar las dependencias manualmente es un dolor de cabeza.
Por supuesto, no debería incluir archivos donde no es necesario .
fuente
Ponga tantas inclusiones en su cpp como sea posible y solo las que necesita el archivo hpp en el archivo hpp. Creo que esto ayudará a acelerar la compilación, ya que los archivos hpp tendrán menos referencias cruzadas.
También considere usar declaraciones de reenvío en su archivo hpp para reducir aún más la cadena de dependencia de inclusión.
fuente
Si yo
#include <callback.h>
, no quiero tener#include
muchos otros archivos de encabezado para compilar mi código. Encallback.h
debe incluir todo lo necesario para compilar. Pero nada mas.Considere si el uso de declaraciones hacia adelante en su archivo de encabezado (como
class GtkButton;
) será suficiente, lo que le permitirá reducir el número de#include
directivas en el encabezado (y, a su vez, mi tiempo de compilación y complejidad).fuente