Почему #include <iostream.h> плохо?

47

Я читал другую ветку, где парень спрашивал о книгах по С ++ для начинающих, и один из отвечавших программистов написал это:

Некоторые предупреждения: избегайте всех книг, которые представляют «привет мир» с

#include <iostream.h>

Я открыл свою книгу по C ++ и, конечно же, включил заголовок iostream, как в примере выше.

Почему это плохо? Какие еще указатели следует учитывать при изучении C ++?

Справочная информация: я хорошо знаю C, и я начну изучать C ++ в следующем семестре.

Даниэль Скокко
источник
3
Другой, связанный указатель, должен включать cstdio, а не stdio.h(последний устарел).
Антон Голов
7
@AntonGolov Мнения расходятся. Многие эксперты предпочитают <stdio.h>, поскольку нет технической причины, по которой предпочтение следует отдавать <cstdio>.
Sjoerd
2
@Sjoerd Тот факт, что я могу <cstdio>предоставить имена, namespace stdявляется достаточной причиной, чтобы я предпочел это. Я знаю, что он может также предоставлять их в глобальном пространстве имен так же, как <stdio.h> и в namespace std. Это также вопрос последовательности, если вы делаете привычкой всегда использовать <c…>заголовки. А для некоторых заголовков вы действительно захотите этого, потому что они расширяют интерфейс C, например, с помощью дополнительных перегрузок функций.
5gon12eder

Ответы:

58

Заголовок iostream.h является нестандартным заголовком и существует не на всех платформах. На самом деле он не существует в моей системе (с использованием g ++ и GNU libstdc ++). Поэтому любой код, использующий его, просто не скомпилируется в моей системе.

iostream.hЗаголовок , используемый для быть общим , прежде чем C ++ был первым стандартизирован в 1998 г. Но поскольку стандарт 98 используется <iostream>вместо <iostream.h>, последний не опале (нестандартными и все) и больше не поддерживается на всех платформах. Код, который его использует, следует считать нестандартным устаревшим кодом и не переносимым. Книги, которые учат этому, следует считать устаревшими и избегать.

sepp2k
источник
14
Я бы не стал избегать книги просто из-за тривиальной проблемы синтаксиса препроцессора. Это может быть отличная книга, в то время как ужасная книга может использовать современный синтаксис.
Лорд Тидус
21
@ Лорд Тидус Тот факт, что любая книга до 98 года может быть отличной, не отрицает того факта, что по статистике вам лучше избегать книг до 98 года.
Майк Накис
12
@LordTydus: совершенно не согласен. Стиль и использование C ++ не такие, как в 98, поэтому это не просто исправление синтаксических проблем.
Мартин Йорк,
7
@LordTydus Если старый синтаксис прост и просто не компилируется на современных компиляторах, вам будет трудно использовать книгу, которая учит старому синтаксису. Обратите внимание, что любая книга, которая учит использованию iostream.h, почти наверняка не учит, например, пространства имен, поэтому даже после замены iostream.h на iostream ваш код не будет работать. Если вам приходится гуглить или обращаться за помощью к SO каждый раз, когда вы хотите скомпилировать пример из книги, это не очень эффективный способ изучения C ++.
sepp2k
3
@LordTydus: В общем, я обнаружил, что книги, в которых используются такие заголовки, также имеют тенденцию использовать плохие методы и изобилуют ошибками. Я начал собирать такие книги, чтобы не выпускать их из обращения.
Greyfade
55

#include <iostream.h>является признаком того, что книга была написана до первого стандарта C ++ в 1998 году (стандартный заголовок iostream).

Проблема в том, что старый код C ++ имеет тенденцию быть написанным способами, которые сегодня считаются плохой практикой. В частности,

  • Использование массивов в стиле C, а не контейнерных классов, таких как std::stringи std::vector.
  • Использование явных closeфункций, а не RAII.

iostream.hэто не самое плохое, что книга до 1998 года ошибется, но, скорее всего, это будет первое , что книга до 1998 года ошибется.

dan04
источник
14
Пригвоздил это к вашему последнему пункту
Легкость гонки с Моникой
1

Может быть, это немного запоздало, но для того, чтобы это стоило, на Unix / Linux Linux Box ls /usr/{local/,}include/c++/*или аналогичный, в зависимости от вашего макета и путей. Вы можете grepнайти нужный заголовок, например:

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

Это влечет за собой поиск, iostream.hкак и любые другие суперструны.

Или запустите find / -type f -name iostream 2> /dev/null | grep includeили locate iostream | grep include(при условии, что база данных актуальна, в противном случае добавьте предваряющий вызов updatedb) - они, тем не менее, будут печатать и не общесистемные включения, поэтому настройте их соответствующим образом Фактический путь включения C ++ легко найти с помощью чего-то вроде:

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

Эквивалентно на Windows и других машинах. Я предполагаю, что идея ясна - такой файл, который iostream.hбольше не существует в системе, включает путь по умолчанию, но вы все равно можете найти устаревшие дистрибутивы libc ++ с iostream.hпрограммной ссылкой iostreamили в виде его копии. Так что это не вопрос стиля, а скорее обстоятельств. Вы можете отправить свой собственный iostream.hпроект, просто убедившись, что он содержится в пути включения, где ваш компилятор ищет <...>заголовки.

Николас
источник
1
Очень практично, но на самом деле не решает реальную фундаментальную точку.
Легкость гонки с Моникой
-1

Просто сбрасываю мои 2 цента. Я не думаю, что есть корреляция между ".h" и качеством книги. Это незначительная проблема синтаксиса. В те времена это был действительно правильный синтнакс.

Можно ли иметь отличную книгу с iostream.h? да

Возможно ли иметь ужасную книгу с iostream? да

Я бы полагался на отзывы пользователей онлайн (и мой собственный обзор после прочтения), чтобы судить о качестве книги.

Лорд тидус
источник
3
Проблема в том, что вы уверены, что хотите книгу «назад в день»?
hugomg
5
Лисп устарел, потому что он с 1958 года? Мы используем работу Пифагора в каждой современной ракетной системе, хотя математике тысячи лет. На текущем книжном рынке C ++ книги ".h" могут быть ужасными. Но это вопрос качества книги, а не «.h». «.h» даже не логика программирования, это для препроцессора.
Лорд Тидус
4
но узнает ли кто-нибудь, изучающий язык впервые, когда книга говорит им что-то не так? Сколько времени и разочарования они пройдут, прежде чем узнают, что «.h» теперь неверен? И во сколько других отношениях книга устарела?
Крис Питман
23
Проблема в том, что использование C ++ значительно изменилось с тех пор, как были написаны эти книги. То, как вы мыслите и используете C ++, совсем не то, что будут представлены в этих книгах, так как в них нет никаких средств, которые есть в современном C ++. В результате вы будете учить себя C с классами, а не C ++.
Мартин Йорк,
3
@ Джорджио: Скучно. Как насчет ACRE. Продвинутый C на Риталине с Исключениями. Акр также подразумевает, что он покрывает много земли. :-)
Мартин Йорк