Стандарт С ++, раздел 17.6.5.2 [res.on.headers], говорит:
заголовка C++ может включать в себя другие заголовки C++.
Это означает, что реализация может включать в себя другие заголовки при включении одного из них. Разумеется, с точки зрения разработчика это вполне практично.
Есть даже заголовки, которые являются гарантированы, чтобы включить другие. Например, <string>
подразумевает <initializer_list>
.
Что касается <iostream>
, это означает <ios>
(что само по себе подразумевает <iosfwd>
), <streambuf>
, <istream>
и <ostream>
. Таким образом, нет никаких гарантий для <ctime>
и <cstdlib>
, и вы должны включить их явно для лучшей переносимости.
Чтобы узнать, какие заголовки гарантированно включать другие, вы можете иметь взгляд себя в стандартной or in a draft (см все конспекты, начиная с раздела 18), или просто перейти к cppreference.com, например http://en.cppreference.com/w/cpp/header/iostream для <iostream>
, Это довольно надежная онлайн-ссылка на C++.
Или вы просто указываете каждый заголовок, в котором вы нуждаетесь. Что может быть лучшим выбором в конце.
* С точки зрения разработчика это совершенно практично *, но также и опасно, поскольку код, который компилируется в одной системе, может не быть другим или в будущем, если заголовок, на который он опирается, включен только косвенно. – Walter
@Walter: Но разве это не то, что я рекомендую в последнем предложении? –
@ChristianHackl Я бы немного изменил это последнее предложение, поскольку это может быть неверно истолковано как рекомендация «всегда включать все заголовки», а не «всегда включать все * обязательные * заголовки». – user4581301