首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用std::setw()而不使用<iomanip>头

使用std::setw()而不使用<iomanip>头
EN

Stack Overflow用户
提问于 2021-07-07 07:47:45
回答 2查看 261关注 0票数 0

即使我没有包含<iomanip>,这段代码怎么可能编译呢?

代码语言:javascript
复制
#include <iostream>
#include <fstream>

int main()
{
    std::cout << std::setw(5) << "test" << std::endl;
    return 0;
}

汇编有:

代码语言:javascript
复制
clang++ test.cpp

但是如果没有<fstream>,它就会抛出错误:

代码语言:javascript
复制
test.cpp:5:20: error: no member named 'setw' in namespace 'std'
        std::cout << std::setw(5) << "test" << std::endl;
                     ~~~~~^
1 error generated.

在我的朋友Mac上,它在两种情况下都会抛出错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-07 07:57:16

根据标准库实现的不同,标头在内部包括它们自己。

标准并不保证一个符号是未定义的,除非你包含一个特定的文件-相反,它保证一个符号将被定义,如果你确实包括它。

在这种情况下,fstream头包含内部的代码,这些代码恰好也有std::setw的定义。

编译器上的代码编译是标准库实现的一个特殊性。

在我们当前的项目中,缺少标头是导致构建失败的常见原因之一(在Windows上构建工作,而不是在Mac上构建,或者反过来)。

通常,为代码中所需的所有内容包括指定的标头,即使代码在没有包含的情况下编译OK。

票数 0
EN

Stack Overflow用户

发布于 2021-07-07 07:56:58

如果对实现来说方便的话,标准C++标头可以包括其他标准标头。您的<fstream>作为实现细节包括了<iomanip>,但在Mac上显然没有包含它。

规则:包括你所需要的,不要依赖偶然的包容。这不会增加开销;标准标头都可以安全地包含不止一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68281993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档