使用 std::setw() 不带<iomanip>标头



即使我没有包含<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上,它显然没有包括在内。

规则:包含你需要的东西,不要依赖于偶然的包含。这不会带来开销;可以安全地多次包含所有标准标头。

相关内容

  • 没有找到相关文章

最新更新