El C++ cabeceras estándar no tienen un sufijo ".h". Creo que la razón es que hubo muchas implementaciones diferentes de estándares que romperían el estándar. Por lo tanto, en lugar de exigir que los proveedores cambien el encabezado exitante "iostream.h" (por ejemplo) para cumplir con los estándares (lo que rompería el código de usuario existente), el comité de estándares decidió que eliminarían el sufijo (que, creo que no entonces la implementación existente ya lo había hecho).
De esta forma, los programas existentes no estándar seguirían funcionando con las bibliotecas no estándar del proveedor. Cuando el usuario quería hacer que sus programas cumplieran con los estándares, uno de los pasos que tomarían es cambiar la directiva "#include
" para soltar el sufijo ".h".
Así
#include <iostream> // include the standard library version
#include <iostream.h> // include a vendor specific version (which by
// now might well be the same)
Como han mencionado otras respuestas, escritores de las bibliotecas no estándar puede elegir cualquiera convención de nomenclatura, pero me gustaría pensar que les gustaría seguir utilizando ".h" o ".hpp" (como se ha hecho Boost) por un par de razones:
- si & cuando la biblioteca se estandarizada, la versión estándar no anulará automáticamente la anterior, no estándar (que causa código de usuario rota con toda probabilidad)
- parece ser una convención (más o menos) que los encabezados sin sufijo son bibliotecas estándar, y aquellos con un sufijo (que no sean los viejos encabezados C) no son estándar.
Tenga en cuenta que un problema similar ocurrió cuando el comité fue a añadir mapas de hash a la STL - se encontraron con que ya hay muchos (diferentes) hash_map
implementaciones que existen, así que en vez de salir con una norma que rompe Hoy hay muchas cosas que llaman la implementación estándar "unordered_map
". Se suponía que los espacios de nombres ayudaban a evitar este tipo de salto a través de los aros, pero no parecía funcionar lo suficientemente bien (ni se usaba lo suficientemente bien) para permitirles usar el nombre más natural sin romper un montón de código.
Tenga en cuenta que para las cabeceras 'C', C++ le permite incluir una variante <cxxxxxx>
o . El que comienza con 'c' y no tiene el sufijo ".h" pone sus declaraciones en el espacio de nombres std
(y posiblemente el espacio de nombres global), los que tienen el sufijo ".h" ponen los nombres en el espacio de nombres global (algunos compiladores también poner los nombres en el espacio de nombres std
- no está claro para mí si eso cumple con los estándares, aunque no veo el daño).
otro (probablemente el motivo principal :)) podría ser señalar que los encabezados estándar no requieren ser archivos en absoluto. por lo que podrían haber decidido soltar el ".h", porque sugiere una extensión de archivo. –
Esto ha sido cierto desde ANSI C 1989, que tiene como nota al pie: "Un encabezado no es necesariamente un archivo fuente ..." Por cierto, ¿alguien sabe de un compilador que hace algo diferente a los archivos fuente normales para encabezados estándar ? –
@MichaelBurr ¿Los encabezados precompilados no encajarían en esa factura? –