2010-06-04 16 views

Odpowiedz

35

iostream.h jest przestarzała przez kompilatory, które ją dostarczają, iostream jest częścią standardu C++.

W tekście nie ma żadnej wzmianki o iostream.h w obecnym standardzie C++ (INCITS ISO IEC 14882 2003).

Edytuj: Jak wspomniała firma @Jerry, nie tylko obecny standard nie wspomina o tym, ale nie wymienia go żaden standard dla C++.

+0

Powinieneś chyba wspomnieć o przestrzeni nazw standardowej. – zdan

+0

@Jerry: Zachowano sformułowanie, ale wyjaśniono znaczenie: –

+0

@Jerry: Dzięki, dodał. –

10

iostream jest standardowym nagłówkiem. iostream.h to niestandardowy nagłówek, który był bardzo powszechny w przed-standardowym C++ i jest tym, z którego wyewoluował iostream. Nadal powszechne jest posiadanie iostream.h wokół, prawdopodobnie do użytku ze starszymi programami.

Jeśli realizacja mieć kopię roboczą iostream, to prawdopodobnie taki sam jak iostream wyjątkiem tego, że wszystko jest w iostream w przestrzeni nazw std, natomiast iostream zazwyczaj poprzedzone nazw, a nie ich używać.

Jeśli realizacja posiada zarówno iostream i iostream, iostream jest prawdopodobne, aby pracować jak:

namespace std 
{ 
#include <iostream.h> 
} 

chociaż to niekoniecznie jak jest napisane.

+1

W rzeczywistości często występuje * dużo * więcej różnic - strumienie w iostream.h zazwyczaj nie były szablonami podobnymi do tego, które znajdują się w systemie iostream. Jeśli robisz dużo więcej niż proste czytanie i pisanie (np. Zapisuj dowolne manipulatory) różnica jest często znaczna. –

+0

@Jerry: Masz rację, ale niestety przywołujesz wspomnienia z systemu, który musiałem przerobić, który miał jakieś źle udokumentowane czary na strumieniach. Jednak nie musi to oznaczać znaczącej różnicy między wersją iostream.h i iostream we współczesnej implementacji. Jeśli pamiętam, przyjrzę się mojej implementacji gcc, kiedy wrócę do domu. –

+1

tak, dlatego skomentowałem gdzie indziej, że różnice między iostream i iostream.h różnią się znacznie. W niektórych wersjach iostream.h jest obecną implementacją z deklaracjami "using" dla całej zawartości. W innych przypadkach jest to stara implementacja (i kilka, coś pomiędzy ...) –

2

Po utworzeniu C++ wszystkie pliki w standardowej bibliotece środowiska wykonawczego zakończyły się na .h. Życie było spójne i było dobrze. Oryginalna wersja cout i cin mieszkała w iostream.h. Kiedy język został ustandaryzowany przez komisję ANSI, postanowili przenieść wszystkie funkcje w bibliotece środowiska wykonawczego do przestrzeni nazw standardowych (co jest generalnie dobrym pomysłem). Jednakże stanowiło to problem: gdyby wszystkie funkcje zostały przeniesione do przestrzeni nazw standardowych, żaden ze starych programów nie działałby dalej!

Aby spróbować obejść ten problem, zachowując zgodność wsteczną starszych programów, wprowadzono nowy zestaw plików nagłówkowych, które używają tych samych nazw, ale nie mają rozszerzenia .h. Te nowe pliki nagłówkowe mają wszystkie swoje funkcje wewnątrz standardowej przestrzeni nazw. W ten sposób starsze programy, które zawierają #include <iostream.h>, nie muszą być przepisywane, a nowsze programy mogą #include <iostream>.

Po dołączeniu pliku nagłówkowego ze standardowej biblioteki upewnij się, że używasz wersji innej niż .h, jeśli istnieje. W przeciwnym razie użyjesz wycofanej wersji nagłówka, która nie jest już obsługiwana.

Ponadto wiele bibliotek odziedziczonych po C, które wciąż były przydatne w C++, otrzymało prefiks c (np. Stdlib.h stał się cstdlib). Funkcjonalność z tych bibliotek została również przeniesiona do przestrzeni nazw standardowej, aby uniknąć nazwania kolizji.

Jednak przy pisaniu własnych plików nagłówkowych należy podać im wszystkie rozszerzenia .h, ponieważ kod ten nie będzie wstawiany do przestrzeni nazw standardowych.

Reguła: użyj wersji biblioteki innej niż h, jeśli istnieje, i uzyskaj dostęp do funkcji poprzez przestrzeń nazw standardu. Jeśli wersja nie .h nie istnieje lub tworzysz własne nagłówki, użyj .h wersji