¿Qué cosas nunca deberían incluirse en un archivo de encabezado?
Si, por ejemplo, estoy trabajando con un formato estándar documentado de la industria que tiene muchas constantes, ¿es una buena práctica definirlas en un archivo de encabezado (si estoy escribiendo un analizador para ese formato)?
¿Qué funciones deben ir en el archivo de encabezado?
¿Qué funciones no deberían?
Respuestas:
Qué poner en los encabezados:
#include
directivas necesarias para que el encabezado sea compilable cuando el encabezado se incluye en algún archivo fuente.Lo que no pertenece en un encabezado:
#include
directivas. Esos gratuitos incluyen la recompilación de cosas que no necesitan ser recompiladas, y a veces pueden hacer que un sistema no pueda compilarse. No haga#include
un archivo en un encabezado si el encabezado en sí no necesita ese otro archivo de encabezado.#include
, que están sujetas a cambios o que son demasiado grandes. Esas funciones en línea deben tener poco o ningún abanico desplegado, y si tienen un abanico desplegado, deben estar localizadas en los elementos definidos en el encabezado.¿Qué constituye el conjunto mínimo de
#include
declaraciones?Esto resulta ser una pregunta no trivial. Una definición TL; DR: un archivo de encabezado debe incluir los archivos de encabezado que definen directamente cada uno de los tipos utilizados directamente o que declaran directamente cada una de las funciones utilizadas en el archivo de encabezado en cuestión, pero no deben incluir nada más. Un puntero o tipo de referencia C ++ no califica como uso directo; Se prefieren las referencias directas.
Hay un lugar para una
#include
directiva gratuita , y esto está en una prueba automatizada. Para cada archivo de encabezado en un paquete de software, genero automáticamente y luego compilo lo siguiente:La compilación debe estar limpia (es decir, libre de advertencias o errores). Las advertencias o errores con respecto a tipos incompletos o tipos desconocidos significan que el archivo de encabezado bajo prueba tiene algunas
#include
directivas faltantes y / o declaraciones de reenvío faltantes. Tenga en cuenta bien: el hecho de que la prueba pase no significa que el conjunto de#include
directivas sea suficiente, y mucho menos mínimo.fuente
Además de lo que ya se ha dicho.
Los archivos H siempre deben contener:
Los archivos H nunca deben contener:
static
.(También diría que nunca hay ninguna razón para usar variables globales / externas no constantes, en cualquier lugar, pero esa es una discusión para otra publicación).
fuente
Probablemente nunca diría nunca, pero las declaraciones que generan datos y código a medida que se analizan no deberían estar en un archivo .h.
Las macros, las funciones en línea y las plantillas pueden parecer datos o código, pero no generan código a medida que se analizan, sino que se usan cuando se usan. Estos elementos a menudo deben usarse en más de un .c o .cpp, por lo que pertenecen al .h.
En mi opinión, un archivo de encabezado debe tener la interfaz práctica mínima para un correspondiente .c o .cpp. La interfaz puede incluir #defines, clase, typedef, definiciones de estructura, prototipos de funciones y definiciones externas menos preferidas para variables globales. Sin embargo, si una declaración se usa en un solo archivo fuente, probablemente debería excluirse del .h y estar contenida en el archivo fuente.
Algunos pueden estar en desacuerdo, pero mi criterio personal para los archivos .h es que #incluyen todos los demás archivos .h que necesitan para poder compilar. En algunos casos, esto puede ser una gran cantidad de archivos, por lo que tenemos algunos métodos efectivos para reducir las dependencias externas, como las declaraciones directas a clases que nos permiten usar punteros a objetos de una clase sin incluir lo que podría ser un gran árbol de archivos de inclusión.
fuente
El archivo de encabezado debe tener la siguiente organización:
Los archivos de encabezado nunca deben contener definiciones de objetos, solo definiciones de tipos y declaraciones de objetos.
fuente
Las declaraciones que generan datos y código a medida que se analizan no deben estar en un
.h
archivo. En lo que respecta a mi punto de vista, un archivo de encabezado solo debe tener la interfaz práctica mínima para un correspondiente.c
o.cpp
.fuente