请考虑以下代码:
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)
?
答案 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
标志列出所有包含。