即使我没有包含<iomanip>
,这个代码怎么可能编译?
#include <iostream>
#include <fstream>
int main()
{
std::cout << std::setw(5) << "test" << std::endl;
return 0;
}
编译使用:
clang++ test.cpp
但如果没有<fstream>
,它会抛出错误:
test.cpp:5:20: error: no member named 'setw' in namespace 'std'
std::cout << std::setw(5) << "test" << std::endl;
~~~~~^
1 error generated.
在我的朋友Mac上,它在两种情况下都会出错
根据标准库实现,标头在内部包含自己。
除非包含某个文件,否则该标准不会保证符号是未定义的——相反,它保证如果包含某个符号,就会定义该符号。
在这种情况下,fstream
标头内部包含恰好也具有std::setw
定义的代码。
在编译器上编译代码是标准库实现的特殊性。
在我们当前的项目中,缺少标头是构建失败的常见原因之一(构建在Windows上有效,但在Mac上无效,或者相反(。
通常,在代码中包含所需的所有内容的指定标头,即使代码在没有包含的情况下编译正常。
如果实现方便,标准C++头可以包括其他标准头。作为实现细节,您的<fstream>
包括<iomanip>
,但在Mac上,它显然没有包括在内。
规则:包含你需要的东西,不要依赖于偶然的包含。这不会带来开销;可以安全地多次包含所有标准标头。