Подтвердить что ты не робот

Iostream vs ostream отличается?

Как говорится в книге (Изучение С++: Введение программиста на С++); Заголовок istream объявляет операторы ввода ( → ), а ostream объявляет операторы вывода (< lt;).
Я могу отлично запустить этот код без добавления #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.

4b9b3361

Ответ 1

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

enter image description here

Ответ 2

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

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

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

Ответ 3

В С++ 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;
}

Ответ 4

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

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

Ответ 5

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

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

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

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