¿Por qué necesitamos escribir un archivo de encabezado?

12

Antes de emitir sus comentarios sarcásticos, lo sé, esta es una pregunta novata. Esta es la primera vez que uso un lenguaje basado en C.

Soy un estudiante de pregrado que está aprendiendo el Objetivo C para un curso de informática sobre desarrollo móvil. Sé que, en un entorno académico, muchas consideraciones del mundo real no son necesarias ya que estás construyendo proyectos más pequeños, trabajando en equipos más pequeños, etc.

Pero nuestro profesor exige, y XCode admite, archivos de encabezado .h para cada archivo de implementación .m. Para mí, parece un trabajo ocupado. Tengo que asegurarme de copiar cada firma de método y variable de instancia al otro archivo. Si cambio un archivo, tengo que asegurarme de que sea consistente con el otro archivo. Parece solo un montón de pequeñas molestias como esa.

Pero sé que tiene que haber algún uso en el mundo real para los archivos de encabezado. Una gran respuesta abordaría ambos:

  1. ¿Para qué sirve un archivo de encabezado para el que no es adecuado un archivo de implementación? ¿Cual es su propósito?
  2. ¿Por qué nosotros como programadores tenemos que escribir manualmente nuestros archivos de encabezado? Parece que podrían generarse fácilmente de forma automática.

¡Gracias por adelantado!

Hartley Brody
fuente
¿XCode admite la refactorización automática para que si cambia una firma en el encabezado se propague automáticamente a la implementación (y viceversa)? ¿O tal vez hay un complemento que lo admite? Sé que es un dolor hacerlo manualmente.
FrustratedWithFormsDesigner
Mi primera reacción cuando supe de los archivos de encabezado fue "debe haber una manera de hacerlo automáticamente". Estaba bastante perplejo cuando intenté buscar una herramienta que me ayudara con eso y no encontré ninguna opción excelente y obvia.
Hartley Brody
Me sorprende que tal funcionalidad no exista. Sé que Eclipse puede hacer esa refactorización para Java, no sé si los complementos C / C ++ pueden hacer refactorización de encabezado / impl. Supongo que si no existe tal herramienta para XCode, podría ser algo que valga la pena desarrollar. ;)
FrustratedWithFormsDesigner

Respuestas:

9
  1. En breve;

    • El archivo de encabezado define la API para un módulo. Es una lista de contratos que métodos puede llamar un tercero. El módulo puede considerarse una caja negra para terceros.

    • La implementación implementa el módulo. Es el interior de la caja negra. Como desarrollador de un módulo, debe escribir esto, pero como usuario de un módulo de terceros, no debería necesitar saber nada sobre la implementación. El encabezado debe contener toda la información que necesita.

  2. Algunas partes de un archivo de encabezado podrían generarse automáticamente: las declaraciones de método. Esto requeriría que anote la implementación, ya que es probable que haya métodos privados en la implementación que no formen parte de la API y no pertenezcan al encabezado.

Los archivos de encabezado a veces tienen otra información en ellos; definiciones de tipo, definiciones constantes, etc. Estas pertenecen al archivo de encabezado y no a la implementación.

Luke Graham
fuente
Pero, ¿cuándo estaría alguien en una situación en la que necesitaran usar mi código, pero solo tuvieran acceso al archivo .h? ¿Todavía no necesitarían el .m para ejecutarlo?
Hartley Brody
1
Entiendo la necesidad de abstracción a nivel teórico, en caso de que cambie los detalles de implementación, pero no estoy seguro de cuándo surgirá una situación como esta.
Hartley Brody
10
A veces, generalmente por razones comerciales, es posible que desee permitir que alguien use su código, pero no tenga acceso a su implementación. En este caso, proporcionaría un archivo de encabezado y una biblioteca o código de objeto que ya se ha compilado.
Luke Graham
Ahh ya veo. No había considerado que el código ya estaría compilado, por lo tanto, utilizable pero no legible. ¡Gracias!
Hartley Brody
3
Además, ¿por qué querría leer la implementación para saber cómo usar su código? Debería ser suficiente para leer el archivo de encabezado.
Per Johansson
5

La razón principal de un encabezado es poder #includeusarlo en algún otro archivo, para que pueda usar las funciones en un archivo de ese otro archivo. El encabezado incluye (solo) suficiente para poder usar las funciones, no las funciones en sí mismas, por lo que (esperamos) compilarlo es considerablemente más rápido.

Mantener los dos por separado la mayoría de los resultados de que nadie haya escrito un editor que automatice muy bien el proceso. Realmente no hay muchas razones por las que no pudieron hacerlo, y algunos incluso lo han intentado, pero los editores que lo han hecho nunca lo han hecho muy bien en el mercado, y los editores más convencionales no lo han adoptado.

Jerry Coffin
fuente
2

La inclusión de un encabezado permite que su código llame a funciones o métodos que están escritos en otro lugar y que pueden o no ser parte de su proyecto / compilación de software, pero que puede encontrar el 'enlazador' cuando está compilando el software.

Por ejemplo, cuando llama a una función en la biblioteca C estándar, entonces no desea tener que poner todas las entrañas de esa función dentro de su proyecto; simplemente espera que su programa pueda llamarla.

Pero su compilador necesita que le digan que la función existe en algún lugar, incluso si no puede ver el código y el encabezado lo hace. Cuando finaliza el compilador, se llama al vinculador y busca 'vincular' esos bits de su código que quedan pendientes, como las llamadas a la biblioteca.

adrianmcmenamin
fuente
1

Los archivos de encabezado se utilizan principalmente para declarar e incluir las firmas (es decir, el nombre de la función, el valor de retorno y los argumentos) de sus funciones en otros archivos. El compilador necesita conocer estas firmas al compilar y vincular sus archivos.

Lea este artículo para más información.

Bernardo
fuente