2010-06-04 41 views

Respuesta

35

iostream.h está en desuso por los compiladores que lo proporcionan, iostream pertenece al estándar C++.

Para aclarar explícitamente no hay ninguna mención de iostream.h en absoluto en el estándar actual de C++ (INCITS ISO IEC 14882 2003).

Editar: Como se menciona @Jerry, no solo el estándar actual no lo menciona, pero ningún estándar para C++ lo menciona.

+0

Probablemente debería mencionar el espacio de nombres estándar. – zdan

+0

@Jerry: Mantuvo la redacción, pero aclaró el significado –

+0

@Jerry: Gracias, agregó. –

10

iostream es un encabezado estándar. iostream.h es un encabezado no estándar que era muy común en C++ pre-estándar, y es de lo que evolucionó iostream. Todavía es común tener iostream.h, presumiblemente para usarlo con programas anteriores.

Si su implementación tiene una copia de trabajo de iostream.h, es probablemente lo mismo que iostream excepto que todo en iostream está en el espacio de nombres std, mientras que iostream.h generalmente precedió a los espacios de nombres, y no los usó.

Si su aplicación tiene tanto iostream y iostream.ho, iostream es probable que funcione como:

namespace std 
{ 
#include <iostream.h> 
} 

aunque eso no es necesariamente la forma en que está escrito.

+1

En realidad, a menudo hay * mucho * más diferencia que eso: las transmisiones en iostream.h normalmente no eran plantillas como en iostream. Si haces mucho más que simple lectura y escritura (por ejemplo, escribir cualquier manipulador), la diferencia suele ser considerable. –

+0

@Jerry: Tienes razón, pero desafortunadamente estás trayendo recuerdos de un sistema que tuve que convertir que tenía una magia mal documentada en las transmisiones. Sin embargo, eso no significa necesariamente que haya una diferencia significativa entre iostream.hy iostream en una implementación moderna. Si recuerdo, veré mi implementación de gcc cuando llegue a casa. –

+1

sí, esa es la razón por la que comenté en otro lugar que las diferencias entre iostream y iostream.h varían ampliamente. En algunos, iostream.h es una implementación actual, con declaraciones 'using' para todos los contenidos. En otros casos, es una implementación antigua (y en algunos, algo intermedio ...) –

2

Cuando se creó C++ por primera vez, todos los archivos de la biblioteca de tiempo de ejecución estándar terminaron en .h. La vida fue consistente y fue buena. La versión original de cout y cin vivía en iostream.h. Cuando el lenguaje fue estandarizado por el comité ANSI, decidieron mover todas las funciones en la biblioteca de tiempo de ejecución al espacio de nombres estándar (que generalmente es una buena idea). Sin embargo, esto presentaba un problema: si trasladaban todas las funciones al espacio de nombres estándar, ¡ninguno de los programas anteriores funcionaría más!

Para tratar de evitar este problema, manteniendo compatibilidad con versiones anteriores para programas anteriores, se introdujo un nuevo conjunto de archivos de encabezado que usan los mismos nombres pero carecen de la extensión .h. Estos nuevos archivos de encabezado tienen toda su funcionalidad dentro del espacio de nombres estándar. De esta manera, los programas anteriores que incluyen #include <iostream.h> no necesitan ser reescritos, y los programas más nuevos pueden #include <iostream>.

Cuando incluye un archivo de encabezado de la biblioteca estándar, asegúrese de utilizar la versión que no es .h si existe. De lo contrario, utilizará una versión obsoleta del encabezado que ya no es compatible.

Además, muchas de las bibliotecas heredadas de C que todavía eran útiles en C++ recibieron un prefijo c (por ejemplo, stdlib.h se convirtió en cstdlib). La funcionalidad de estas bibliotecas también se movió al espacio de nombres estándar para ayudar a evitar el nombramiento de colisiones.

Sin embargo, cuando escribe sus propios archivos de encabezado, debe darles una extensión .h, ya que no colocará su código en el espacio de nombres estándar.

Regla: utilice la versión no .h de una biblioteca, si existe, y acceda a la funcionalidad mediante el espacio de nombres std. Si la versión no .h no existe, o si está creando sus propios encabezados, use la versión .h