Perché # include iostream.h male?

46

Stavo leggendo un altro thread dove un ragazzo ha chiesto dei libri C ++ per principianti, e uno dei programmatori che ha risposto ha scritto questo:

Some warnings: avoid all books that present an "hello world" stating with

#include <iostream.h>

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

Perché è così male? Quali altri indicatori dovrei tenere a mente quando apprendo C ++?

Background: sono esperto di C e inizierò ad imparare C ++ questo prossimo semestre.

    
posta Daniel Scocco 26.12.2011 - 13:03
fonte

4 risposte

57

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

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

    
risposta data 26.12.2011 - 13:20
fonte
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 a essere scritto in modi che oggi sono considerati cattivi. In particolare,

  • L'uso di matrici in stile C piuttosto che di classi contenitore come std::string e std::vector .
  • L'uso delle funzioni esplicite close piuttosto che RAII.

iostream.h non è la cosa peggiore che un libro del 1998 potrebbe sbagliare, ma è probabile che sia la prima cosa che un libro pre-1998 sbagliare.

    
risposta data 26.12.2011 - 21:55
fonte
1

Forse è un po 'tardi ma per quello che vale, su una casella unix / linux fai ls /usr/{local/,}include/c++/* o simili, secondo il tuo layout e i tuoi percorsi. Potresti reindirizzare a grep cercando l'intestazione in questione, ad esempio:

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

Ciò comporta una ricerca di iostream.h e qualsiasi altra superstringa.

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

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

Equivalentemente su Windows e altre macchine. Suppongo che l'idea sia chiara: un file come iostream.h non esiste nel sistema include path per default più a lungo, puoi comunque trovare distribuzioni libc ++ legacy con iostream.h o soft-linked a iostream o come sua copia. Quindi questa non è una questione di stile, ma piuttosto delle circostanze. Puoi spedire il tuo iostream.h con il tuo progetto assicurandoti che sia contenuto nel percorso di inclusione in cui il tuo compilatore cerca le intestazioni <...> .

    
risposta data 30.07.2013 - 12:21
fonte
-1

Ho appena lasciato cadere i miei 2 centesimi. Non penso ci sia una correlazione tra ".h" e la qualità di un libro. Questo è un problema di sintassi minore. Nel giorno in cui era in realtà il sytnax corretto.

È possibile avere un bel 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.

    
risposta data 26.12.2011 - 14:28
fonte

Leggi altre domande sui tag