编译没有(必要?)#include

时间:2015-09-19 16:24:19

标签: c++ time include exit

请考虑以下代码:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\((\\d{4})\\)" options:0 error:NULL];
NSString *str = @"Accepted (2006)";
NSTextCheckingResult *match = [regex firstMatchInString:str options:0 range:NSMakeRange(0, [str length])];

为什么在没有#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)

2 个答案:

答案 0 :(得分:2)

C ++标准,第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,例如<iostream> http://en.cppreference.com/w/cpp/header/iostream。这是一个非常可靠的在线C ++参考。

或者您只需明确包含所需的每个标头。这可能是最终的最佳选择。

答案 1 :(得分:0)

是的,iostream包含cstdlib(至少在您的情况下;您不应该依赖该依赖关系链)。 您的编译器可能有一个列出依赖项的选项,例如:对于GNU C编译器,您可以使用-M标志列出所有包含。