2015-09-19 4 views
0

Рассмотрим следующий код:Компиляция без (нужно?) #include

#include <iostream> 

using namespace std; 

int main() { 

srand(time(0)); 
double dd [10]; 
for(int i=0;i!=10; ++i) dd[i]= rand()%5+0; 

for(auto i:dd) 
cout<<i<<' '; 

cout<<endl; 

exit(100); 

} 

Почему компиляцией без #include<ctime> и #include<cstdlib> для звонков time(0) и exit(100) (что совершенно бесполезно там, я знаю)? Они уже включены в iostream?

ответ

2

Стандарт С ++, раздел 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++.

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

+0

* С точки зрения разработчика это совершенно практично *, но также и опасно, поскольку код, который компилируется в одной системе, может не быть другим или в будущем, если заголовок, на который он опирается, включен только косвенно. – Walter

+0

@Walter: Но разве это не то, что я рекомендую в последнем предложении? –

+0

@ChristianHackl Я бы немного изменил это последнее предложение, поскольку это может быть неверно истолковано как рекомендация «всегда включать все заголовки», а не «всегда включать все * обязательные * заголовки». – user4581301

0

Да, iostream включает в себя cstdlib (по крайней мере, в вашем случае, вы не должны полагаться на эту цепочку зависимостей). У вашего компилятора может быть опция для перечисления зависимостей, например. для компилятора GNU C вы можете использовать флаг -M для включения всех включенных в него.

Смежные вопросы