可以在没有#include <string>的情况下使用std :: string吗?

时间:2015-10-26 15:41:14

标签: c++ stdstring

这是我的代码:

#include <iostream>

int main(int argc, char const *argv[])
{
    std::string s = "hello";
    std::cout << s.size() << std::endl;
    return 0;
}

令我惊讶的是,我可以使用clang++编译并运行它,但我甚至不添加#include <string>

那么,是否有必要添加#include <string>才能使用std::string

4 个答案:

答案 0 :(得分:10)

您的实施iostream标题包含string。这不是你可以或应该依赖的东西。如果您想使用std::string,则应始终#include <string>,否则您的程序可能无法在不同的实现上运行,甚至可能在当前版本的更高版本中运行。

答案 1 :(得分:2)

某些标题可能包含其他标题,但这是一个实现问题,而不是您可以依赖的内容。始终明确包含您需要的标题。

答案 2 :(得分:2)

简而言之:是的,这是必要的。

标准库的某些部分通常使用其他部分,因此通过<string>以某种方式包含<iostream>,并且您的代码编译得很好。

如果您不小心决定不再需要<iostream>并删除该包含,则<string>也会被隐式删除,并且您会收到令人困惑的编译错误。这就是为什么把所有必要的包括在内是一个好习惯。

答案 3 :(得分:1)

iostream包括<string>。它涟漪过来。

实际上,这依赖于实现,而不是保证。您应该明确包含所需的标题。