enum - namespace c++ para que sirve
¿Cómo funciona#include en C++? (3)
Si se incluye una biblioteca en un encabezado de clase y luego este encabezado se incluye en otra clase, ¿debo volver a incluir la biblioteca?
Por ejemplo:
#ifndef A_H
#define A_H
#include<someLibrary.h>
class A{
...
}
#endif
Entonces otra clase incluye el encabezado Ah
#include<A.h> //include class A
class B{
...
}
¿Debo incluir el "someLibrary.h" en la clase B?
La directiva del preprocesador #include
hace exactamente lo que su nombre implica, en realidad incluye el archivo en el lugar de la directiva.
Ejemplo simple: Digamos que tenemos archivos, primero un archivo de encabezado llamado ah
// Our class
class A
{
// Stuff for the class
};
// End of the class
Luego un archivo fuente a.cpp
:
// Include header file
#include "a.h"
// Header file included
int main()
{
// Code
}
El preprocesador genera un solo archivo que se parece a
// Include header file
// Our class
class A
{
// Stuff for the class
};
// End of the class
// Header file included
int main()
{
// Code
}
Esta inclusión es recursiva, por lo que si un archivo de encabezado incluye otro archivo de encabezado, también se incluirá ese otro archivo de encabezado.
El archivo de origen generado por el preprocesador se llama unidad de traducción y es lo que realmente ve el compilador.
Lo anterior es una simplificación de cómo funciona un preprocesador moderno, y si bien se puede ejecutar por separado para crear un archivo fuente preprocesado, es más común que el preprocesador sea parte del compilador para optimizar el proceso de análisis sintáctico.
También debe tener en cuenta que la terminología que usa no es correcta. Una biblioteca puede (y generalmente lo hace) tener uno o más archivos de encabezado, que se utilizan al compilar su código fuente. Una biblioteca a menudo (pero no siempre) contiene un archivo de biblioteca especial que está vinculado con los archivos de objeto creados por el compilador.
Una biblioteca que no tiene una biblioteca enlazadora se denomina biblioteca solo encabezado .
No, #include
s son transitivos.
Sin embargo, si su segundo archivo usa símbolos de alguna Biblioteca , es un buen estilo volver a incluir el encabezado. De esa forma no estás "esperando y orando" que nunca elimines el intermedio. Su base de código será más robusta si cada archivo fuente #include
todo lo que necesita directamente. Los protectores de cabecera evitan que esto sea una política derrochadora.
No incluye clases o bibliotecas, solo incluye encabezados, y eso es una operación de texto (un poco como copiar y pegar hecho por el preprocesador).
Lea más sobre el preprocesador C / C ++ y el GNU cpp .
Puede pedirle a su compilador que le muestre la forma preprocesada de su archivo fuente foo.cc
, por ejemplo, con g++ -Wall -C -E foo.cc
(se extenderá en el formato g++ -Wall -C -E foo.cc
preprocesado)
Para un proyecto pequeño (por ejemplo, menos de 200KLOC), es sensato tener solo un único archivo de encabezado común incluido en todas sus unidades de traducción (y creo que tener muchos pequeños archivos de encabezado es un mal hábito, así que generalmente pongo más de una definición de clase archivo de cabecera). Por cierto, ese enfoque (solo archivo de cabecera) es amigable para los encabezados precompilados . Algunas personas prefieren tener varios subcabeceras #include
-d en ese encabezado único.
Tenga en cuenta que la mayoría de los encabezados estándar de C ++ (como <map>
o <vector>
....) traen una gran cantidad de texto, por lo que no desea tener unidades de compilación pequeñas (en mi sistema Linux, #include <vector>
está arrastrando más de diez mil líneas, por lo que tener solo unas pocas docenas de sus líneas de código fuente después es ineficaz para el compilador)
También tenga en cuenta que las definiciones de las clases C ++ generalmente tienen muchas funciones integradas (y prácticamente quiere dar al cuerpo de esa función en el mismo archivo de encabezado). Así que el código de encabezado C ++ tiende a ser bastante grande ...
(algunas personas prefieren dividir un único archivo de encabezado en muchos subtítulos, que siempre se incluyen juntos)