Por que #include <iostream.h> é ruim?

47

Eu estava lendo outro tópico em que um cara perguntou sobre livros em C ++ para iniciantes, e um dos programadores que responderam escreveu isso:

Alguns avisos: evite todos os livros que apresentem um "olá mundo" declarando com

#include <iostream.h>

Abri meu livro em C ++ e, com certeza, incluía o cabeçalho iostream como no exemplo acima.

Por que isso é ruim? Que outros indicadores devo ter em mente ao aprender C ++?

Antecedentes: Sou proficiente em C e começarei a aprender C ++ neste próximo semestre.

Daniel Scocco
fonte
3
Outro ponteiro relacionado é incluir cstdio, não stdio.h(o último está obsoleto).
Anton Golov
7
As opiniões do @AntonGolov são diferentes. Muitos especialistas preferem <stdio.h>, pois não há motivo técnico pelo qual o <cstdio> deva ser preferido.
Sjoerd
2
@ Sjoerd O fato de <cstdio>garantir os nomes namespace stdé motivo suficiente para eu preferir. Eu sei que ele também pode fornecê-los no espaço de nomes global, assim como <stdio.h> pode fornecê-los namespace std. Também é uma questão de consistência se você criar o hábito de sempre usar os <c…>cabeçalhos. E para alguns cabeçalhos, você realmente desejará isso, porque eles aprimoram a interface C com sobrecargas adicionais de funções, por exemplo.
precisa saber é o seguinte

Respostas:

58

O cabeçalho iostream.h é um cabeçalho não padrão e não existe em todas as plataformas. De fato, ele não existe no meu sistema (usando o g ++ e o GNU libstdc ++). Portanto, qualquer código que o utilize simplesmente não será compilado no meu sistema.

O iostream.hcabeçalho costumava ser comum antes do C ++ ser padronizado pela primeira vez em 1998. Mas desde que o padrão 98 foi usado, em <iostream>vez de <iostream.h>, o último caiu em desuso (sendo não padrão e tudo) e não é mais suportado em todas as plataformas. O código que o utiliza deve ser considerado código legado não padrão e não é portátil. Os livros que o ensinam devem ser considerados ultrapassados ​​e evitados.

sepp2k
fonte
14
Eu não evitaria um livro imediatamente por causa de um problema trivial de sintaxe do pré-processador. Pode ser um ótimo livro, enquanto um livro terrível pode estar usando a sintaxe moderna.
Lord Tydus
21
@Lord Tydus O fato de que qualquer pré-98 do livro poderia ser um grande livro não nega o fato de que, estatisticamente, você seria melhor evitar pré-98 livros.
precisa
12
@ LordTydus: Discordo totalmente. O estilo e o uso do C ++ não são os mesmos de 98. Portanto, não se trata apenas de corrigir problemas sintáticos.
Martin York
7
@LordTydus Se a sintaxe antiga não for compilada nos compiladores modernos, será difícil usar um livro que ensine a sintaxe antiga. Observe que qualquer livro que ensina o uso do iostream.h quase certamente também não ensina, por exemplo, namespaces, portanto, mesmo depois de substituir o iostream.h pelo iostream, seu código não funcionará. Se você precisar pesquisar no Google ou pedir ajuda no SO toda vez que quiser compilar um exemplo do livro, essa não é uma maneira muito eficaz de aprender C ++.
sepp2k
3
@LordTydus: Em geral, descobri que livros que usam cabeçalhos assim também tendem a usar más práticas e estão repletos de erros. Eu comecei a colecionar esses livros apenas para mantê-los fora de circulação.
greyfade
55

#include <iostream.h>é um sinal de que o livro foi escrito antes do primeiro padrão C ++ em 1998 (o cabeçalho padrão é iostream).

O problema é que o código C ++ mais antigo tende a ser gravado de maneiras que hoje são consideradas más práticas. Em particular,

  • O uso de matrizes no estilo C em vez de classes de contêiner como std::stringe std::vector.
  • O uso de closefunções explícitas em vez de RAII.

iostream.hnão é a pior coisa que um livro antes de 1998 vai dar errado, mas é provável que seja a primeira coisa que um livro antes de 1998 vai dar errado.

dan04
fonte
14
Preguei com o seu parágrafo final.
Lightness Races com Monica
1

Talvez isso seja um pouco tarde, mas pelo que vale a pena, em uma caixa unix / linux faça ls /usr/{local/,}include/c++/*ou similar, de acordo com seu layout e caminhos. Você pode grepprocurar o cabeçalho em questão, como:

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

Isso envolve uma pesquisa iostream.h, bem como quaisquer outras supercordas.

Ou execute find / -type f -name iostream 2> /dev/null | grep includeou locate iostream | grep include(desde que o banco de dados seja atual; caso contrário, inclua uma chamada para updatedb) - estes, no entanto, também imprimirão inclusões que não são do sistema, portanto, ajuste-o adequadamente. O caminho de inclusão C ++ real é facilmente encontrado com algo como:

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

Equivalentemente no Windows e em outras máquinas. Eu acho que a idéia é clara - como um arquivo iostream.hque não existe no sistema inclui o caminho por padrão por mais tempo, você ainda pode, no entanto, encontrar distribuições legadas do libc ++ com iostream.hum link direto iostreamou cópia dele. Portanto, isso não é uma questão de estilo, mas das circunstâncias. Você pode enviar seu próprio iostream.hprojeto apenas para garantir que ele esteja contido no caminho de inclusão, onde seu compilador procura os <...>cabeçalhos.

Nicholas
fonte
1
Muito prático, mas realmente não aborda o ponto fundamental real.
Lightness Races com Monica
-1

Apenas caindo meus 2 centavos. Eu não acho que exista uma correlação entre ".h" e a qualidade de um livro. Esse é um problema menor de sintaxe. Naquela época, era na verdade a sintaxe correta.

É possível ter um ótimo livro com o iostream.h? sim

É possível ter um livro terrível com o iostream? sim

Eu confiaria nas resenhas de usuários on-line (e na minha própria resenha após a leitura) para julgar a qualidade de um livro.

Lord Tydus
fonte
3
O problema é que você tem certeza de que deseja um livro de "antigamente"?
hugomg
5
Lisp está desatualizado porque é de 1958? Utilizamos o trabalho de Pitágoras em todos os sistemas modernos de mísseis, embora a matemática tenha milhares de anos. No mercado atual de livros em C ++, os livros ".h" podem ser terríveis. Mas é uma qualidade de edição de livro, não de ".h". ".h" nem sequer é lógica de programação, é para o pré-processador.
Lord Tydus
4
mas alguém aprenderá o idioma pela primeira vez saberá quando o livro está dizendo algo errado? Quanto tempo e frustração eles passam antes de descobrir que o ".h" agora está incorreto? E de quantas outras maneiras o livro está desatualizado?
Chris Pitman
23
O problema é que o uso do C ++ mudou significativamente desde que esses livros foram escritos. O modo como você pensa e usa o C ++ não é o mesmo que os livros apresentarão, pois eles não possuem nenhuma das facilidades que o C ++ moderno possui. Como resultado, você estará aprendendo C com aulas e não com C ++.
Martin York
3
@Giorgio: chato. E o ACRE. C avançado em ritalina com exceções. O Acre também implica que ele cobre muito terreno. :-)
Martin York