¿Cuáles son las ventajas y desventajas de usar archivos de encabezado en un idioma como C o C++ en un idioma como Java? Creo que las clases deben diseñarse desde el exterior, por lo que es bueno tener archivos de encabezado y no tener que pasar por los detalles de implementación. Sin embargo, nuevamente, cada declaración de función está duplicada en dos archivos. Si C y C++ se inventaran hoy, ¿usarían archivos de cabecera? ¿Este mecanismo está desactualizado o es necesario?Ventajas/desventajas de los archivos de encabezado
Respuesta
tomada de un relacionado blog post por Eric Lippert, quien lo expresa muy bien:
que habría pedido el equivalente pregunta ¿por qué cabecera C++ necesidad archivos? Los archivos de encabezado parecen un gran punto de falla potencial ; todo el tiempo edito código C++ y cambio la firma de un método; si me olvido de actualizar el archivo de encabezado, entonces el código no se compila y a menudo da un mensaje de error críptico . Esperemos que este gran costo realmente te compre algo.
Compra una cosa al compilador, y al usuario una cosa.
lo que compra el usuario es que se puede compilar cada individuo “CPP” archivo en un archivo “obj” de forma independiente, siempre y cuando tenga todos los cabeceras necesarias. Toda la información necesaria para generar los cuerpos que se encuentran en un archivo cpp determinado se puede obtener del conjunto de encabezados. Esto significa que el sistema de compilación puede recompilar solo aquellos archivos cpp que cambiaron, siempre que no haya un encabezado cambiado.
Lo que compra el escritor del compilador es que cada archivo se puede compilar en "one pass". Debido a que cada tipo y método declaración se procesan antes su primer uso, el compilador puede simplemente empezar desde el principio del archivo, tracción en todas las cabeceras incluidos y proceder de arriba hacia abajo, escupiendo fuera del archivo obj como va, nunca teniendo que volver atrás y volver a visitar algo que ya se ve.
Esto está en contraste con idiomas como C# (sobre el cual la publicación del blog es) y Java, que es un pariente muy cercano.
Lo interesante de esto es lo que compra el usuario. Le permite al usuario volver a compilar archivo por archivo. Pero esto solo es realmente necesario debido a los extravagantes tiempos de compilación/enlace de C y especialmente C++. Entonces, en mi opinión, todo se trata del compilador y el desarrollador deficiente es el ciudadano de segunda clase. –
Java es un pariente cercano de C#. Java es el padre de C#. – irreputable
@irreputable: Eso me hizo reír. También es una opinión que comparto. – Jon
En pocas palabras, en C o C++, los archivos de encabezado permiten que diferentes archivos compartan definiciones o declaraciones comunes.
En Java todo es un objeto, por lo que no existe el concepto de compartir nada excepto objetos. Cada objeto es un archivo; si desea acceder al objeto, importe el archivo.
Sigue siendo una buena idea separar la interfaz y la implementación. Pero no tiene que ser una separación física. En Java puedes ver la interfaz de javadoc. Los IDE de Java generalmente pueden mostrar estructuras de API, y pueden doblar bloques. No hay razones convincentes que requieran separación física. C se inventó hace décadas, así que no necesitamos elegirlo.
- 1. ¿Son inútiles los archivos .lib sin los archivos de encabezado?
- 2. dependencia cíclica entre los archivos de encabezado
- 3. Una comprensión básica de los archivos de encabezado de C++
- 4. Archivos de encabezado no encontrados
- 5. Evitando las dependencias circulares de los archivos de encabezado
- 6. ¿Dónde AC-CHECK_HEADERS de autoconf verifica los archivos de encabezado?
- 7. Tratando con los archivos de encabezado de Boost
- 8. ¿Cómo funcionan los archivos de encabezado y fuente en C?
- 9. ¿Dónde busca gcc los archivos de encabezado C y C++?
- 10. ¿No podemos declarar métodos en los archivos de encabezado?
- 11. ¿Dónde busca Visual Studio los archivos de encabezado C++?
- 12. ¿por qué los archivos de encabezado STL no tienen extensión?
- 13. incluyendo archivos de encabezado de diferentes directorios?
- 14. Encabezados precompilados en archivos de encabezado
- 15. Dependencias de los archivos de encabezado entre los módulos de C++
- 16. C funciones sin archivos de encabezado
- 17. cómo vincular archivos de encabezado en C++
- 18. Cómo puedo crear archivos de encabezado C
- 19. Archivos de encabezado para x36 SIMD intrinsics
- 20. Convertir archivos de encabezado C++ a Python
- 21. Búsqueda de generador de código auxiliar (de archivos de encabezado)
- 22. ¿Qué debo poner en los comentarios del encabezado en la parte superior de los archivos fuente?
- 23. Establecer el encabezado Content-Disposition en los archivos adjuntos solo en los archivos de un directorio determinado?
- 24. Definición de la variable en archivos de encabezado
- 25. ¿Qué es un encabezado de tipo de contenido apropiado para los archivos de JavaScript?
- 26. Usos para espacios de nombres anónimos en archivos de encabezado
- 27. Comentando código C, encabezado y archivos fuente
- 28. Costo de incluir archivos de encabezado en Objective-C
- 29. ¿Dónde el método have_header de Ruby busca archivos de encabezado?
- 30. C++: Razón por la cual usar ".hh" como extensión para los archivos de encabezado de C++
java? ¿Me he perdido algo? – CromTheDestroyer
[mu] (http://en.wikipedia.org/wiki/Mu_%28negative%29) ... pero los archivos de encabezado me permiten ser flojo y no escribir todas las declaraciones (y tipos y enumeraciones y define macros) en todos los archivos de código fuente "simple" – pmg
Las clases de Java (al menos en mi escuela) generalmente se definen en un archivo. Las clases C, C++ y Object C generalmente se definen en dos archivos. – jeffythedragonslayer