为什么在#include<string>之后仍然需要使用std::string?

3
为了使用字符串,我需要包含字符串头文件,以便其实现可用。但如果是这样,为什么我仍然需要添加using std::string这一行呢?
它为什么不已经知道字符串数据类型呢?
#include <string>

using std::string;

int main() {
    string s1;
}

使用 namespace std 放入一行代码,直接使用字符串。 - M Monis Ahmed Khan
6
这不是不好的做法吗?我尽量只在需要时使用“using”。 - vanmarcke
6
@vanmarcke 这是一个不好的习惯,你使用得很正确。 - mpiatek
4
为什么使用using namespace std被认为是一种不好的习惯?请参考这篇回答:https://dev59.com/D3M_5IYBdhLWcg3wQQ3w?rq=1 在此之前,请先了解命名空间的概念(可以查看mpiatek的回答)。 - Garf365
4个回答

8

string被定义在名为std的命名空间中。

在包含<string>的情况下,您可以在任何地方写std::string,但是您可以添加using std::string并且不使用命名空间(因此std::string可以称为string)。 您可以将其放置在函数内部,然后仅适用于该函数:

#include <string>

void foo() {
    using std::string;

    string a; //OK
}

void bar() {
    std::string b; //OK
    string c; //ERROR: identifier "string" is undefined
}

1
那么字符串在字符串头中没有定义? - vanmarcke
2
@vanmarcke 它在 std 命名空间内的字符串头文件中定义。请查看我的答案末尾的链接。 - mpiatek

8

using std::string;并不意味着您现在可以使用该类型,而是意味着您可以在不必在类型名称前指定命名空间std::的情况下使用该类型。

以下代码是正确的:

#include <string>

int main()
{
    std::string s1;
    return 0;
}

2
由于类 string 的声明在命名空间 std 中,因此您需要始终通过 std::string 访问它(这样您就不需要使用 using 语句),或按照您所做的方式进行访问。

1

命名空间是 C++ 的一个附加功能,用于定义变量、函数或对象的作用域并避免名称冲突。在此处,string 对象被定义在 std 命名空间中。

std 是标准命名空间。其中包括了 coutcinstring 等许多其他东西。

头文件 <string> 声明与字符串库相关的各种实体,而命名空间用于分组相关的功能,并允许在不同的命名空间中使用相同的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接