¿Por qué es malo #include <iostream.h>?

47

Estaba leyendo otro hilo donde un chico preguntó sobre libros de C ++ para principiantes, y uno de los programadores que respondieron escribió esto:

Algunas advertencias: evite todos los libros que presenten un "hola mundo" con

#include <iostream.h>

Abrí mi libro C ++ y, efectivamente, incluía el encabezado iostream como en el ejemplo anterior.

¿Por qué es eso malo? ¿Qué otros indicadores debo tener en cuenta al aprender C ++?

Antecedentes: soy competente con C y comenzaré a aprender C ++ el próximo semestre.

Daniel Scocco
fuente
3
Otro puntero relacionado es incluir cstdio, no stdio.h(este último está en desuso).
Anton Golov
77
@AntonGolov Las opiniones difieren. Muchos expertos prefieren <stdio.h> ya que no hay una razón técnica por la que se deba preferir < cstdio>.
Sjoerd
2
@Sjoerd El hecho de que <cstdio>se garantice que proporcione los nombres namespace stdes motivo suficiente para que lo prefiera. Sé que podría también proporcionarles a nombre-espacio global al igual que <stdio.h> podría proporcionarles en namespace std. También es una cuestión de coherencia si acostumbras a usar siempre los <c…>encabezados. Y para algunos encabezados, realmente querrá esto porque mejoran la interfaz C con sobrecargas de funciones adicionales, por ejemplo.
5gon12eder

Respuestas:

58

El encabezado iostream.h es un encabezado no estándar y no existe en todas las plataformas. De hecho, no existe en mi sistema (usando g ++ y GNU libstdc ++). Entonces, cualquier código que lo use simplemente no se compilará en mi sistema.

El iostream.hencabezado solía ser común antes de que C ++ se estandarizara por primera vez en 1998. Pero desde que se usó el estándar 98 en <iostream>lugar de <iostream.h>, este último ha caído en desgracia (no es estándar y todo) y ya no es compatible con todas las plataformas. El código que lo usa debe considerarse un código heredado no estándar y no es portátil. Los libros que lo enseñan deben considerarse obsoletos y evitarse.

sepp2k
fuente
14
No evitaría un libro simplemente por un problema trivial de sintaxis del preprocesador. Podría ser un gran libro, mientras que un libro terrible podría estar utilizando la sintaxis moderna.
Lord Tydus
21
@ Lord Tydus El hecho de que cualquier libro anterior al 98 pueda ser un gran libro no niega el hecho de que estadísticamente, sería mejor evitar los libros anteriores al 98.
Mike Nakis
12
@ LordTydus: Totalmente en desacuerdo. El estilo y el uso de C ++ no es el mismo que en 98, por lo que no se trata solo de solucionar problemas sintácticos.
Martin York
77
@LordTydus Si la sintaxis anterior es simple y simplemente no se compila en compiladores modernos, tendrá dificultades para usar un libro que enseñe la sintaxis anterior. Tenga en cuenta que cualquier libro que enseñe el uso de iostream.h seguramente tampoco enseña, por ejemplo, espacios de nombres, por lo que incluso después de reemplazar iostream.h con iostream, su código no funcionará. Si tiene que buscar en Google o pedir ayuda sobre SO cada vez que desea compilar un ejemplo del libro, esa no es una forma muy efectiva de aprender C ++.
sepp2k
3
@ LordTydus: En general, he encontrado que los libros que usan encabezados como ese también tienden a usar malas prácticas y están plagados de errores. He empezado a coleccionar tales libros solo para mantenerlos fuera de circulación.
greyfade
55

#include <iostream.h>es una señal de que el libro fue escrito antes del primer estándar C ++ en 1998 (el encabezado estándar es iostream).

El problema es que el código C ++ anterior tiende a escribirse de una manera que hoy se considera una mala práctica. En particular,

  • El uso de matrices de estilo C en lugar de clases de contenedor como std::stringy std::vector.
  • El uso de closefunciones explícitas en lugar de RAII.

iostream.hno es lo peor que un libro anterior a 1998 se equivocará, pero es probable que sea lo primero que se equivoque un libro anterior a 1998.

dan04
fuente
14
Clavado con su último párrafo.
Lightness compite con Monica el
1

Tal vez esto llegue un poco tarde, pero para lo que vale, en un cuadro de Unix / Linux hacer ls /usr/{local/,}include/c++/*o similar, de acuerdo con su diseño y rutas. Podrías grepbuscar el encabezado en cuestión, como:

ls /usr/{local/,}include/c++/* | grep iostream 

Esto implica una búsqueda, iostream.hasí como cualquier otra supercadena.

O ejecute find / -type f -name iostream 2> /dev/null | grep includeo locate iostream | grep include(siempre que la base de datos esté actualizada; de lo contrario, anteponga una llamada a updatedb); estos, sin embargo, imprimirán también inclusiones que no sean de todo el sistema, por lo que debe ajustarlas adecuadamente. La ruta de inclusión real de C ++ se encuentra fácilmente con algo como:

g++ -v 2>&1| sed -rn 's/.+gxx-include[^=]+=([^ ]+).+/\1/p' # adjust iff empty

Equivalente en Windows y otras máquinas. Supongo que la idea es clara: un archivo que iostream.hya no existe en el sistema incluye la ruta de forma predeterminada, sin embargo, aún puede encontrar distribuciones libc ++ heredadas con iostream.henlaces suaves iostreamo como su copia. Así que esto no es una cuestión de estilo sino de circunstancias. Puede enviar el suyo propio iostream.hcon su proyecto solo asegúrese de que esté contenido en la ruta de inclusión donde su compilador busca los <...>encabezados.

Nicholas
fuente
1
Muy práctico pero realmente no aborda el punto fundamental real.
Lightness compite con Monica el
-1

Solo dejo caer mis 2 centavos. No creo que haya una correlación entre ".h" y la calidad de un libro. Este es un problema menor de sintaxis. En el pasado, en realidad era la sintaxis correcta.

¿Es posible tener un gran libro con iostream.h? si

¿Es posible tener un libro terrible con iostream? si

Confiaría en las opiniones de los usuarios en línea (y en mi propia opinión después de leer) para juzgar la calidad de un libro.

Lord Tydus
fuente
3
El problema es, ¿estás seguro de que quieres un libro de "atrás en el día"?
hugomg
55
¿Lisp está desactualizado porque es de 1958? Utilizamos el trabajo de Pitágoras en todos los sistemas de misiles modernos a pesar de que las matemáticas tienen miles de años. En el mercado actual de libros de C ++, los libros ".h" pueden ser terribles. Pero es una cuestión de calidad del libro, no una cuestión ".h". ".h" ni siquiera es lógica de programación, es para el preprocesador.
Lord Tydus
44
¿Pero alguien que está aprendiendo el idioma por primera vez sabrá cuándo el libro les dice algo malo? ¿Cuánto tiempo y frustración pasarán antes de descubrir que el ".h" ahora es incorrecto? ¿Y de cuántas otras maneras está desactualizado el libro?
Chris Pitman
23
El problema es que el uso de C ++ ha cambiado significativamente desde que se escribieron esos libros. La forma en que piensa y usa C ++ no es la misma que presentarán esos libros, ya que no tienen ninguna de las facilidades que tiene C ++ moderno. Como resultado, te enseñarás C con clases, no C ++.
Martin York
3
@Giorgio: aburrido. ¿Qué hay de ACRE? C avanzado en Ritalin con excepciones. Acre también implica que cubre mucho terreno. :-)
Martin York