c++ - includes - ¿Cuál es la diferencia entre un archivo.cpp y un archivo.h?
include class c++ (8)
Sé la diferencia entre una declaración y una definición.
Mientras:
- Un archivo CPP incluye las definiciones de cualquier encabezado que incluya (porque CPP y el archivo de encabezado juntos se convierten en una sola ''unidad de traducción'')
- Un archivo de encabezado puede ser incluido por más de un archivo CPP
- Normalmente, al vinculador no le va a gustar nada definido en más de un archivo CPP
Por lo tanto, cualquier definición en un archivo de encabezado debe estar en línea o estática. Los archivos de encabezado también contienen declaraciones que son utilizadas por más de un archivo CPP.
Las definiciones que no son ni estáticas ni en línea se colocan en los archivos CPP. Además, cualquier declaración que solo se necesite dentro de un archivo CPP a menudo se coloca dentro de ese archivo CPP, en lugar de en cualquier archivo de encabezado (compartido).
Debido a que he creado archivos .cpp y luego los he transferido a archivos .h, la única diferencia que puedo encontrar es que no puede #incluir archivos .cpp. ¿Hay alguna diferencia que me falta?
El archivo .cpp es la unidad de compilación: es el archivo de código fuente real que se compilará (en C ++).
Los archivos .h (encabezado) son archivos que se copiarán y pegarán virtualmente en los archivos .cpp donde aparece la instrucción del precompilador #include. Una vez que el código de los encabezados se inserta en el código .cpp, la compilación de .cpp puede comenzar.
El sistema de compilación C ++ (compilador) no conoce diferencia, por lo que es una de las convenciones.
La convención es que los archivos .h son declaraciones y los archivos .cpp son definiciones.
Es por eso que los archivos .h son #incluidos, incluimos las declaraciones.
Los archivos .h o archivos de encabezado se utilizan para enumerar las variables de instancia y los métodos de acceso público en la declaración de clase. Los archivos .cpp o los archivos de implementación se usan para implementar realmente esos métodos y usar esas variables de instancia.
La razón por la que están separados es porque los archivos .h no se compilan en código binario, mientras que los archivos .cpp sí lo están. Tome una biblioteca, por ejemplo. Digamos que usted es el autor y no desea que sea de código abierto. Entonces distribuye la biblioteca binaria compilada y los archivos de encabezado a sus clientes. Eso les permite ver fácilmente toda la información sobre las clases de su biblioteca que pueden usar sin poder ver cómo implementó esos métodos. Son más para las personas que usan su código en lugar del compilador. Como se dijo antes: es la convención.
Otros ya han ofrecido buenas explicaciones, pero pensé que debería aclarar las diferencias entre las diversas extensiones:
Source Files for C: .c Header Files for C: .h Source Files for C++: .cpp Header Files for C++: .hpp
Por supuesto, como ya se ha señalado, estas son solo convenciones. El compilador en realidad no les presta atención, es solo por el beneficio del codificador.
Por convención, los archivos .h son incluidos por otros archivos y nunca compilados directamente por ellos mismos. Los archivos .cpp son, nuevamente, por convención, las raíces del proceso de compilación. incluyen archivos .h directa o indirectamente, pero generalmente no archivos .cpp.
Una buena regla de oro es que los archivos .h deben tener declaraciones [potencialmente] utilizadas por múltiples archivos de origen, pero no hay código que se ejecute. "
Un archivo de encabezado ( .h
, .hpp
, ...) contiene
- Definiciones de
class X { ... };
(class X { ... };
) - Definiciones de funciones en
inline int get_cpus() { ... }
(inline int get_cpus() { ... }
) - Declaraciones de funciones (
void help();
) - Declaraciones de objeto (
extern int debug_enabled;
)
Un archivo fuente ( .c
, .cpp
, .cpp
) contiene
- Definiciones de funciones (
void help() { ... }
ovoid X::f() { ... }
) - Definiciones de objetos (
int debug_enabled = 1;
)
Sin embargo, la convención de que los encabezados se nombran con un sufijo .h
y los archivos de origen se nombran con un sufijo .cpp
realmente no es necesario. Uno siempre puede decirle a un buen compilador cómo tratar algún archivo, independientemente de su sufijo de nombre de archivo ( -x <file-type>
para gcc. Como -x c++
).
Los archivos de origen contendrán definiciones que deben estar presentes solo una vez en todo el programa. Entonces, si incluye un archivo fuente en alguna parte y luego vincula el resultado de la compilación de ese archivo y luego el del archivo fuente en sí, entonces, por supuesto, obtendrá errores del enlazador, porque ahora esas definiciones aparecen dos veces: una vez en el archivo fuente incluido, y luego en el archivo que lo incluyó. Es por eso que tuvo problemas para incluir el archivo .cpp
.