Чому #include <iostream.h> погано?


47

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

Деякі застереження: уникайте всіх книг, які представляють "привіт світ", в якому йдеться

#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>, останній не опалі (нестандартними і все) і більше не підтримується на всіх платформах. Код, який його використовує, слід вважати нестандартним застарілим кодом і не є портативним. Книги, які її навчають, слід вважати застарілими та уникати їх.


14
Я б не уникнув книги прямо через тривіальний синтаксис препроцесора. Це може бути чудова книга, тоді як жахлива книга може використовувати сучасний синтаксис.
Лорд Тидус

21
@ Лорд Тидус Той факт, що будь-яка книга, отримана до 98 року, може бути чудовою книгою, не відміняє того факту, що статистично вам краще уникати попередніх 98 книг.
Майк Накіс

12
@LordTydus: Повністю не згоден. Стиль та використання C ++ не такі, як у 98, тому це не просто виправлення синтаксичних питань.
Мартін Йорк

7
@LordTydus Якщо старий синтаксис простий і просто не збирається на сучасних компіляторах, вам буде важко використовувати книгу, яка навчає старого синтаксису. Зауважте, що будь-яка книга, яка вчить використання iostream.h, майже напевно, не навчає, наприклад, просторів імен, тому навіть після заміни iostream.h на iostream ваш код не працюватиме. Якщо вам доведеться google або звертатися за допомогою до SO щоразу, коли ви хочете скласти приклад з книги, це не дуже ефективний спосіб вивчити C ++.
sepp2k

3
@LordTydus: Взагалі, я виявив, що книги, які використовують такі заголовки, як правило, також використовують погані практики, і вони переповнені помилками. Я взявся збирати такі книги просто для того, щоб не виходити з обігу.
greyfade

55

#include <iostream.h>є ознакою того, що книга була написана до першого стандарту C ++ у 1998 році (стандартний заголовок iostream).

Проблема полягає в тому, що старший код C ++, як правило, пишеться так, що сьогодні вважається поганою практикою. Зокрема,

  • Використання масивів у стилі С, а не контейнерних класів типу std::stringта std::vector.
  • Використання явних closeфункцій, а не RAII.

iostream.hне найгірше, що книга до 1998 року помилиться, але це, ймовірно, перше , що книга до 1998 року помилиться.


14
Прибити його своїм заключним абзацом.
Гонки легкості з Монікою

1

Можливо, це приходить трохи пізно, але для того, що це варто, в поле Unix / linux зробіть 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
@Giorgio: Нудно. Що з ACRE Розширений C на Ritalin за винятком. Акр також означає, що він покриває багато ґрунту. :-)
Мартін Йорк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.