Должен ли я использовать #include <string> рядом с <iostream>?

Я начал изучать С++, и я прочитал книгу, которая пишет, что я должен использовать заголовочный файл <string>, потому что строковый тип не встроен непосредственно в компилятор. Если я использую <iostream>, я могу использовать тип строки.

Нужно ли включать заголовок <string>, когда я хочу использовать тип строки, если я включил заголовок <iostream>? Зачем? Есть ли разница?

Ответы

Ответ 1

Да, вы должны включить то, что используете. Он не требует, чтобы стандартные заголовки включали друг друга (за некоторыми исключениями, IIRC). Теперь он может работать, но может произойти сбой в другом компиляторе.

В вашем случае, очевидно, <iostream> включает <string>, прямо или косвенно, но не полагается на него.

Ответ 2

Нужно ли включать заголовок <string>, когда я хочу использовать строковый тип, если я включил заголовок <iostream>?

Да, вам нужно. Вы не можете полагаться на соответствующие заголовки (например, <string>), являющиеся #include d косвенно через другие заголовки (например, <iostream>), хотя это может иметь место в некоторых реализациях.

И даже если это может показаться сработавшим, это может привести к проблемам, если не все импортируемые переменные некоторых операторов импортированы или если класс объявлен в заголовке #include, но информация об этом класс, полученный из некоторого другого класса, содержится только в заголовке, который не получает #include d.

См., например, fooobar.com/info/351240/... для примера таких ситуаций.