2009-05-17 107 views
44

Como he creado archivos .cpp y luego los he transferido a archivos .h, la única diferencia que puedo encontrar es que no se puede #incluir archivos .cpp. ¿Hay alguna diferencia que me falta?¿Cuál es la diferencia entre un archivo .cpp y un archivo .h?

+7

En realidad, puede incluir archivos .cpp. Puedes incluir todo lo que quieras. –

+0

Para comprender las respuestas de las personas a continuación, es posible que deba hacer otra pregunta: es decir, "¿Cuál es la diferencia entre una 'declaración' y una 'definición' en C++?" – ChrisW

+1

Sé la diferencia entre una declaración y una definición. –

Respuesta

42

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.

+0

El sistema de compilación de C++ diferencia: intente ejecutar g ++ en un archivo .h y un archivo .cpp y vea qué ocurre, por ejemplo. –

+0

Sé que los archivos .cpp se usan (la mayoría de las veces) para definir funciones/clases/etc que se han declarado en archivos .h, pero también se pueden definir variables en archivos .h. –

+5

@Neil Butterworth: Sí, el compilador de G ++ entiende la convención, pero puede hacerla compilar forzando el idioma. –

0

Por convención, los archivos .h están incluidos en 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.

17

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 o 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.

+0

¿Por qué dices THE .cpp file y no A .cpp? –

+9

@ Keand64: Porque el compilador busca solo * un archivo * .cpp a la vez cuando compila cosas. Lee un archivo .cpp, lee todos los archivos .h incluidos, lo compila todo, escribe un archivo .o (o .obj) y luego pasa al siguiente archivo .cpp. –

6

.h Los archivos, 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.

1

Otros ya han ofrecido buenas explicaciones, pero pensé que debería aclarar las diferencias entre las distintas 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, estos son sólo convenciones. El compilador en realidad no les presta atención, es solo por el beneficio del codificador.

+3

La mayoría de la gente realmente usa .h para C++ también. – Zifre

+0

@Zifre: Sí, de ahí que diga que estas son * convenciones recomendadas de nomenclatura *, aunque es posible que muchas no las sigan. – Noldorin

1

Una buena regla general es ".h los archivos deben tener declaraciones [potencialmente] utilizadas por varios archivos de origen, pero no se ejecuta ningún código".

5

Un encabezado (.h, .hpp, ...) Archivo contiene

  • definiciones de clase (class X { ... };)
  • Inline definiciones de funciones (inline int get_cpus() { ... })
  • declaraciones de función (void help();)
  • declaraciones de objetos (extern int debug_enabled;)

Un archivo fuente (.c , .cpp, .cxx) contiene

  • Las definiciones de funciones (void help() { ... } o void X::f() { ... })
  • definiciones de objetos (int debug_enabled = 1;)

Sin embargo, la convención de que las cabeceras se nombran con un .h sufijo de origen y de los archivos se nombran con el sufijo .cpp no es realmente requerido. Siempre se puede contar a un buen compilador cómo tratar algún archivo, independientemente de su sufijo de nombre de archivo (-x <file-type> para gcc. Me gusta -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.

12

Conozco la diferencia entre una declaración y una definición.

Considerando lo siguiente:

  • Un archivo CPP incluye las definiciones de cualquier encabezado que se incluye (porque el archivo CPP y cabecera juntos convertirse en una sola 'unidad de traducción')
  • Un archivo de cabecera podría incluirse por más de un archivo CPP
  • El enlazador normalmente no le gusta nada definido en más de un archivo CPP

El 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).

Cuestiones relacionadas