iostream vs ostream чем отличается? - PullRequest
16 голосов
/ 13 февраля 2012

Как сказано в книге (Изучение C ++: Введение программиста в C ++);
Заголовок istream объявляет операторы ввода (>>), а ostream объявляет операторы вывода (<<). </strong>
Я могу прекрасно выполнить этот код без добавления #include ostream;

#include <iostream>
using namespace std;
int main()
{
  cout << "hello world"<< endl;
  return 0;
}

Но в примере с книгой, например

#include <iostream>
#include <ostream>    //why?
using namespace std;
int main()
{
  cout << "hello world"<< endl;
  return 0;
}

Итак, iostream, ostream, istream - это заголовочные файлы, верно?
Если ostream не нужен (iostream выполняет задания) почему автор включает его в качестве примера?Или почему заголовочный файл ostream все еще существует ?

Примечание : В книге Брюса Эккеля Vol 1 (опубликованной в 2000 году) нет ничего о ostream or istream.Только один заголовочный файл iostream.

Ответы [ 5 ]

16 голосов
/ 13 февраля 2012

Как отметил ildjarn в комментарии, стандарт C ++ от 2003 года говорит, что iostream не обязательно включает istream и ostream. Так что теоретически книга верна.

Однако большинство крупных поставщиков компиляторов добавили istream и ostream в iostream, поэтому ваш код работает на используемом вами компиляторе. Вам может не повезти на каком-то другом компиляторе.

Если вы хотите написать переносимый код, который будет компилироваться на более старых компиляторах, которые соответствуют только стандарту 2003 (или более раннему), вы должны включить оба заголовка. OTOH, если вы единственный, кто компилирует ваш код и имеет контроль над тем, какие компиляторы будут использоваться, можно безопасно использовать только iostream, потому что он совместим с форвардом.

11 голосов
/ 13 февраля 2012

В C ++ 11, как указано в стандарте в § 27.4.1, заголовок iostream включает в себя заголовки istream и ostream сами по себе, поэтому #include <ostream> является избыточным.

Синопсис iostream, данный стандартом в вышеупомянутом разделе, равен

#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>

namespace std {
    extern istream cin;
    extern ostream cout;
    extern ostream cerr;
    extern ostream clog;

    extern wistream wcin;
    extern wostream wcout;
    extern wostream wcerr;
    extern wostream wclog;
}
6 голосов
/ 13 февраля 2012

Вам необходимо #include <iostream>, чтобы получить доступ к стандартным объектам потока, таким как cout. Автор этого кода старается не полагаться на детали реализации, которые <iostream> включает <ostream> (что не было гарантировано до C ++ 11).

Вам нужно <ostream>, чтобы получить доступ к operator << и std::endl.

5 голосов
/ 16 февраля 2012

Итак, после этого;Я отправил электронное письмо Бьярне Страуструпу, и он ответил так:
Лично я всегда использую iostream , и вам никогда не нужны оба. ostream существует для того, чтобы люди могли включать в себя только минимальную необходимую декларацию.

enter image description here

3 голосов
/ 19 февраля 2012

Я могу отлично выполнить этот код без добавления #include ostream;

Вы, возможно, сможете на вашей конкретной установке. Обновите вашу цепочку инструментов и , что больше не может иметь место .

Начиная с C ++ 11 вы можете принять это за iostream / ostream, но есть и другие подобные сценарии, которые C ++ 11 не охватывает.

Итак, общее правило: всякий раз, когда вы используете стандартную библиотечную функцию, включает заголовок, в котором он объявлен / определен , вместо того, чтобы делать предположения и ярлыки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...