2017-02-24 93 views
0

为了使用字符串我需要包含字符串标题,以便它的实现变得可用。但如果是这样,为什么我仍然需要添加行using std::string为什么在#include <string>之后仍然需要使用std :: string?

为什么不知道字符串数据类型?

#include <string> 

using std::string; 

int main() { 
    string s1; 
} 
+0

使用命名空间std和使用字符串直接 –

+6

是不是不好的做法把一条线吗?我尝试只为我需要的东西使用“使用”。 – vanmarcke

+5

@vanmarcke这是一个不好的做法,你正确使用它。 – mpiatek

回答

5

由于string被命名空间称为std内定义。

你可以写std::string随处其中包括<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

1

Namespace是C++,它定义一个变量,函数或对象的范围,并避免名称冲突的附加特征。这里,string对象在std命名空间中定义。

std是标准命名空间。 coutcin,string以及许多其他的东西在里面定义。

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

2

因为类string的声明位于命名空间std中。因此,您需要始终通过std :: string访问它(然后您不需要使用它),或者像您那样做。

7

using std::string;并不意味着您现在可以使用此类型,但可以使用此类型,而不必在类型名称前指定名称空间std::

下面的代码是正确的:

#include <string> 

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