Perché #include <iostream.h> è male?


47

Stavo leggendo un altro thread in cui un ragazzo ha chiesto informazioni sui libri in C ++ per principianti e uno dei programmatori che ha risposto ha scritto questo:

Alcuni avvertimenti: evita tutti i libri che presentano un "ciao mondo"

#include <iostream.h>

Ho aperto il mio libro C ++ e sicuramente includeva l'intestazione iostream come nell'esempio sopra.

Perché è così male? Quali altri suggerimenti dovrei tenere a mente durante l'apprendimento del C ++?

Contesto: sono esperto di C e inizierò a imparare C ++ nel prossimo semestre.


3
Un altro puntatore correlato è quello di includere cstdio, non stdio.h(quest'ultimo è deprecato).
Anton Golov,

7
@AntonGolov Le opinioni differiscono. Molti esperti preferiscono <stdio.h> poiché non vi è alcun motivo tecnico per cui <cstdio> dovrebbe essere preferito.
Sjoerd,

2
@Sjoerd Il fatto che <cstdio>sia garantito per fornire i nomi namespace stdè un motivo sufficiente per preferirlo. So che potrebbe anche fornirli nello spazio dei nomi globale così come <stdio.h> potrebbe fornirli namespace std. È anche una questione di coerenza se si prende l'abitudine di usare sempre le <c…>intestazioni. E per alcune intestazioni, lo vorrai davvero perché migliorano l'interfaccia C con sovraccarichi di funzione aggiuntivi, ad esempio.
5gon12eder

Risposte:


58

L'intestazione iostream.h è un'intestazione non standard e non esiste su tutte le piattaforme. È un dato di fatto che non esiste sul mio sistema (usando g ++ e GNU libstdc ++). Quindi qualsiasi codice che lo utilizza semplicemente non si compila sul mio sistema.

L' iostream.hintestazione era comune prima che il C ++ fosse standardizzato per la prima volta nel 1998. Ma poiché lo standard 98 è stato utilizzato al <iostream>posto di <iostream.h>, quest'ultimo è caduto in disgrazia (essendo non standard e tutti) e non è più supportato su tutte le piattaforme. Il codice che lo utilizza deve essere considerato un codice legacy non standard e non è portatile. I libri che lo insegnano dovrebbero essere considerati obsoleti ed evitati.


14
Non eviterei assolutamente un libro solo a causa di un banale problema di sintassi del preprocessore. Potrebbe essere un grande libro mentre un libro terribile potrebbe usare la sintassi moderna.
Lord Tydus,

21
@Lord Tydus Il fatto che un dato libro pre-98 possa essere un grande libro non nega il fatto che statisticamente sarebbe meglio evitare libri pre-98.
Mike Nakis,

12
@LordTydus: totalmente in disaccordo. Lo stile e l'uso del C ++ non sono gli stessi del 98, quindi non risolvono solo problemi sintattici.
Martin York,

7
@LordTydus Se la vecchia sintassi è semplice e semplicemente non si compila su compilatori moderni, avrai difficoltà a usare un libro che insegna la vecchia sintassi. Si noti che qualsiasi libro che insegna l'uso di iostream.h quasi certamente non insegna neanche gli spazi dei nomi, quindi anche dopo aver sostituito iostream.h con iostream, il codice non funzionerà. Se devi cercare su Google o chiedere aiuto su SO ogni volta che vuoi compilare un esempio dal libro, questo non è un modo molto efficace per imparare il C ++.
sepp2k,

3
@LordTydus: In generale, ho scoperto che i libri che usano intestazioni del genere tendono anche a usare cattive pratiche e sono pieni di errori. Ho preso a raccogliere tali libri solo per tenerli fuori dalla circolazione.
Greyfade,

55

#include <iostream.h>è un segno che il libro è stato scritto prima del primo standard C ++ nel 1998 (l'intestazione standard è iostream).

Il problema è che il vecchio codice C ++ tende ad essere scritto in modi che oggi sono considerati cattive pratiche. In particolare,

  • L'uso di array in stile C anziché di classi contenitore come std::stringe std::vector.
  • L'uso di closefunzioni esplicite piuttosto che RAII.

iostream.hnon è la cosa peggiore che un libro precedente al 1998 sbaglierà, ma è probabilmente la prima cosa che un libro precedente al 1998 sbaglierà.


14
Inchiodato con il tuo ultimo paragrafo.
Lightness Races con Monica l'

1

Forse questo arriva un po 'in ritardo, ma per quello che vale, su un box unix / linux ls /usr/{local/,}include/c++/*o simili, in base al layout e ai percorsi. Puoi grepcercare di cercare l'intestazione in questione, come:

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

Ciò comporta una ricerca iostream.he qualsiasi altra superstringa.

O esegui find / -type f -name iostream 2> /dev/null | grep includeo locate iostream | grep include(a condizione che il database sia aggiornato, altrimenti anteponi con una chiamata a updatedb) - questi, tuttavia, stamperanno anche inclusioni non a livello di sistema, quindi ti preghiamo di adattarle in modo appropriato. Il percorso di inclusione C ++ effettivo si trova facilmente con qualcosa del tipo:

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

Equivalentemente su Windows e altre macchine. Immagino che l'idea sia chiara: un file che iostream.hnon esiste nel sistema include più il percorso di default, tuttavia, puoi ancora trovare le distribuzioni libc ++ legacy con iostream.hsoft-link iostreamo come copia. Quindi questa non è una questione di stile, ma piuttosto delle circostanze. Puoi spedire il tuo iostream.hcon il tuo progetto solo assicurandoti che sia contenuto nel percorso include in cui il compilatore cerca le <...>intestazioni.


1
Molto pratico ma non affronta davvero il vero punto fondamentale.
Lightness Races con Monica l'

-1

Sto solo lasciando cadere i miei 2 centesimi. Non penso che ci sia una correlazione tra ".h" e la qualità di un libro. Questo è un problema minore di sintassi. In passato era in realtà il sinocchio corretto.

È possibile avere un ottimo libro con iostream.h? sì

È possibile avere un libro terribile con iostream? sì

Mi affiderei alle recensioni degli utenti online (e alla mia recensione dopo la lettura) per giudicare la qualità di un libro.


3
Il problema è, sei sicuro di volere un libro di "back in the day?"
hugomg,

5
Lisp è obsoleto perché è del 1958? Utilizziamo il lavoro di Pitagora in tutti i moderni sistemi missilistici anche se la matematica ha migliaia di anni. Nell'attuale mercato dei libri in C ++ i libri ".h" potrebbero essere terribili. Ma è una questione di qualità del libro, non un problema ".h". ".h" non è nemmeno logica di programmazione, è per il preprocessore.
Lord Tydus,

4
ma qualcuno che imparerà la lingua per la prima volta saprà quando il libro sta dicendo loro qualcosa di sbagliato? Quanto tempo e frustrazione passeranno prima di scoprire che il ".h" non è corretto? E in quanti altri modi il libro è obsoleto?
Chris Pitman,

23
Il problema è che l'uso del C ++ è cambiato in modo significativo da quando quei libri sono stati scritti. L'intero modo in cui pensi e usi il C ++ non è lo stesso di quei libri che presenteranno perché non hanno nessuna delle funzionalità che il C ++ moderno ha. Di conseguenza ti insegnerai C con classi non C ++.
Martin York,

3
@Giorgio: noioso. Che dire di ACRE. C avanzato su Ritalin con eccezioni. Acre implica anche che copre un sacco di terreno. :-)
Martin York,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.