即使我没有包含<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上,它在两种情况下都会抛出错误。
发布于 2021-07-07 07:57:16
根据标准库实现的不同,标头在内部包括它们自己。
标准并不保证一个符号是未定义的,除非你包含一个特定的文件-相反,它保证一个符号将被定义,如果你确实包括它。
在这种情况下,fstream头包含内部的代码,这些代码恰好也有std::setw的定义。
编译器上的代码编译是标准库实现的一个特殊性。
在我们当前的项目中,缺少标头是导致构建失败的常见原因之一(在Windows上构建工作,而不是在Mac上构建,或者反过来)。
通常,为代码中所需的所有内容包括指定的标头,即使代码在没有包含的情况下编译OK。
发布于 2021-07-07 07:56:58
如果对实现来说方便的话,标准C++标头可以包括其他标准标头。您的<fstream>作为实现细节包括了<iomanip>,但在Mac上显然没有包含它。
规则:包括你所需要的,不要依赖偶然的包容。这不会增加开销;标准标头都可以安全地包含不止一次。
https://stackoverflow.com/questions/68281993
复制相似问题