Pregunta

No entiendo muy bien el punto de tener una cabecera; parece violar el principio DRY! Toda la información en una cabecera está (puede ser) contenida en la aplicación.

¿Fue útil?

Solución

Esto simplifica el proceso de compilación. Cuando se desea compilar unidades de forma independiente, se necesita algo para describir las piezas que se van a enlazar sin tener que importar la totalidad de todos los otros archivos.

También permite la ocultación de código. Uno puede distribuir una cabecera para permitir que otros utilicen la funcionalidad sin tener que distribuir la aplicación.

Por último, puede fomentar la separación de la interfaz de la aplicación.

No son la única manera de resolver estos problemas, pero hace 30 años que eran una buena. Es probable que no utilice los archivos de cabecera para un lenguaje de hoy, pero que no fueron inventados en 2009.

Otros consejos

Los arquitectos de muchos idiomas modernos como Java, C # Eiffel y coinciden claramente con ustedes - los idiomas extraer los metadatos acerca de un módulo de la aplicación. Sin embargo, por sí mismo, el concepto de cabeceras no excluye que - es obvio que sería una tarea sencilla para un compilador para extraer un archivo .h durante la compilación de un .c, por ejemplo, al igual que los compiladores para esos otros lenguajes de manera implícita. El hecho de que los compiladores de C actuales típicos no lo hacen, no es una cuestión de diseño del lenguaje - es una cuestión de implementación; Aparentemente no hay demanda por los usuarios de esta característica, por lo que no molesta proveedor compilador de su aplicación.

Como una opción de diseño del lenguaje, que tiene archivos separados (.h en un formato de texto legible y editable) le ofrece lo mejor de ambos mundos: usted puede comenzar a compilar por separado código de cliente basado en una implementación de módulo que aún no existe , si lo desea, al escribir el archivo .h a mano; o (suponiendo por absurda una implementación del compilador que lo suministra ;-) puede obtener el archivo .h automáticamente de la aplicación como un efecto secundario de elaboración del mismo.

Si C, C ++, etc., mantener próspera (parece que todavía están haciendo bien hoy ;-), y la demanda como la suya para no escribir manualmente encabezados crece, finalmente compilador escritores tendrán que suministrar la opción "generación de cabecera", y el "mejor de ambos mundos" no se quedará teórico -)

Ayuda a pensar un poco acerca de las capacidades de las computadoras que estaban disponibles cuando, por ejemplo c, fue escrito. La memoria principal se midió en kilowords, y no necesariamente muy muchos de ellos. Los discos eran más grandes, pero no mucho. almacenamiento significaba Serrious cintas de carrete a carrete, montados a mano, por los operadores de mal humor, que realmente quería que se vaya lejos para que pudieran desempeñar la caza wumpus. Una máquina 1 MIPS fue gritando rápido . Y con todas estas limitaciones que tenía que compartir ella. Posiblemente con una puntuación de otros usuarios.

Todo lo que reduce el espacio o Hora de la complejidad de la compilación fue una gran victoria. Y las cabeceras hacer ambas cosas.

No se olvide de la documentación de una cabecera proporciona. Por lo general hay nada en ella que necesita saber para usar el módulo. Por mi parte, no quiero escanear a través de un código fuente looong para aprender lo que hay que necesito usar y cómo llamarlo ... lo haría extraer esta información de todos modos, que en la práctica se traduce en - un archivo de cabecera. Ya no es un problema con entornos de desarrollo modernos, por supuesto, pero trabajar con algún viejo código C que realmente les encanta tener los archivos de cabecera hechos a mano que incluyen comentarios sobre el uso y sobre condiciones previas y posteriores.

Mantener fuente, cabecera y documentación adicional en sincronía todavía es otra lata de gusanos ...

La idea de la inspección de los archivos de salida binarias de procesadores de lenguaje habría sido difícil de comprender cuando C inventó archivos .h. Había un sistema llamado JOVIAL que hizo algo parecido, pero era exótica y confinado más- o menos exclusivamente a proyectos militares. (Nunca he visto un programa JOVIAL, sólo he oído hablar de él.)

Así que cuando C salió el patrón de diseño habitual para la modularidad era "ninguna comprobación en absoluto". Puede haber una restricción que podría .text símbolos único vínculo con .text y .data a .DATA, pero eso fue todo. Es decir, los compiladores del día normalmente procesan un archivo de fuente en un momento y luego enlazadores ellos juntos sin el menor nivel de comprobación de errores que no sea, si tenías suerte, "Soy un símbolo de función" vs "Estoy un símbolo de datos".

Así que la idea de tener que realmente el compilador entiende lo estuviera llamando era algo nuevo.

Incluso hoy en día, si usted hace una cabecera totalmente falsa, nadie te atrapa en la mayoría AOT compiladores . cosas inteligentes como lenguajes CLR y Java realmente hacen cosas codificar en los archivos de clase.

Así que sí, en el largo plazo, que probablemente no tienen archivos de cabecera.

No se usted no tiene cabeceras en Java - pero tiene las interfaces y cada gurú de Java grave recomienda definir cualquier cosa usada por otros proyectos / sistemas como una interfaz y una implementación

.

Vamos a ver una interfaz Java definición contiene las firmas de llamadas, las definiciones de tipos y contants.

Los más archivos de cabecera C contienen firmas de llamadas, definiciones de tipos y constantes.

Así que para todos los efectos practicos C / C ++ archivos de cabecera son sólo definiciones de interfaz y por lo tanto debe considerarse como una buena cosa. Ahora sé que es posible definir una miríada de otras cosas en los archivos de cabecera, así (MARCROs, constantes, etc, etc), pero que sólo una parte de todo el maravilloso mundo de C: -

int function target () {
    // Default for shoot
    return FOOT;
}

En Detalle Leer este

Un archivo de cabecera contiene habitualmente hacia adelante declaraciones de clases, subrutinas, variables y otros identificadores. Los programadores que deseen declarar identificadores normalizados en más de un archivo de origen pueden colocar dichos identificadores en un archivo de cabecera única, que luego otro código puede incluir siempre que se requieran los contenidos de cabecera.

La biblioteca estándar de C y C ++ biblioteca estándar declaran tradicionalmente sus funciones estándar en los archivos de cabecera.

¿Y si se quiere dar alguien más las declaraciones de usar su biblioteca sin darles la implementación?

Como otra respuesta señala - la razón original para encabezados era hacer el análisis sintáctico / compile más fácil en las plataformas con herramientas muy simples y limitados. Fue un gran paso adelante para tener una máquina con 2 disquetes lo que podría tener el compilador en uno y su código por el otro -. Hecho las cosas mucho más fácil

Cuando se divide el código en archivos de cabecera y de la fuente se divide declaración y definición. Cuando se mira en los archivos de cabecera se puede ver lo que tiene y si la varita para ver los detalles de implementación de ir a la fuente de archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top