Почему пропуск «#include <string>» только иногда приводит к ошибкам компиляции?
=====================================================================================

Я начинающий с C ++. Когда я пишу код иногда я пишу`#include <string>` и код работает, в других случаях я не пишу`#include <string>` и код не работает. Но иногда это работает без`#include <string>`.

Так я должен написать`#include <string>` чтобы код работал?

 которые объявлены внутри стандартного заголовка`string` тогда да, вы должны включить этот заголовок прямо или косвенно (через другие заголовки).

Несколько компиляторы нанесколько платформы могут нанесколько время месяца компилируется, даже если вы не включили заголовок. Такое поведение неудачно, ненадежно и не означает, что вы не должны включать заголовок.

Причина в том, что вы включили другие стандартные заголовки, которыетакже случается включать`string`, Но, как я уже сказал, на это вообще нельзя полагаться, и это может также измениться очень внезапно (например, когда установлена новая версия компилятора).

Всегда включайте все необходимые заголовки. К сожалению, не существует надежной онлайн-документации, в которую нужно включать заголовки. Обратитесь к книге или официальному стандарту C ++.

Например, следующий код компилируется с моим компилятором (`gcc` 4.6):

Но если я удаляю первую строку, она больше не компилируется, хотя`iostream` заголовок должен быть на самом деле не связан.



телем тип, тип нужно только объявить:

Но когда вы используете значение, компилятор должен знать размер и, соответственно, определение типа.

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



 что строка заголовка включена другими заголовками. Сама строка заголовка имеет только включает в себя. Нет определений. Таким образом, все необходимые определения, необходимые для использования строки, находятся в заголовках, включенных в строку заголовка. Эти заголовки уже могут быть включены другими заголовками. Тогда все работает. Например, заголовок ios включает stringbuf, который включает ...



Другие заголовки, которые вы**делать** включать есть`#include <string>` в них.

Тем не менее, это обычно хорошая идея`#include <string>` непосредственно в вашем коде, даже если это не является строго необходимым для успешной сборки, в случае изменения этих «других» заголовков - например, из-за другой (или другой версии) реализации компилятора / стандартной библиотеки, платформы или даже просто конфигурации сборки.

(Конечно, это обсуждение относится к любому заголовку, а не только`<string>`.)



непосредственный возникновение`#include <string>` в конкретном исходном файле не означает, что он не был включен другим заголовочным файлом. Учти это:

Файл:`header.h`

Файл:`source1.cc`

Файл:`source2.cc`

Файл:`source3.cc`