为什么我需要 std 和字符串库才能在 C++ 中使用字符串
Why do i need both std and string library to use strings in c++
我知道 string
类型存在于 namespace std
中。我还知道需要包含 <string>
库才能使用 string
类型。我的问题是:为什么我需要两者(包括库和使用 std 命名空间)来定义字符串?为什么我不能通过包含库来使用它?更一般地说,namespace std
包含库中缺少的内容?
这样看:std::string
是类型的全名,很像"M. Kostas"是你的全名。
#include <string>
给你 std::string
。仅当您首先建立了正确的上下文时,您才可以将其称为 string
,例如通过 using namespace std
或 using std::string
,或者如果您自己恰好是 namespace std { /* ... */ }
.
中的库代码
再次考虑与姓氏的类比。如果我首先确定我在谈论 "Kostas" 家族 (= using namespace std
),或者如果我之前用 "M." 说过,我只能用 "M." 来称呼你我实际上是指 "M. Kostas" (= using std::string
) ,或者如果我自己是 "Kostas" 家族的成员 (= namespace std { /* ... */ }
).
请注意,您应该(至少包括我在内的许多程序员认为)很少使用 using namespace std
或 using std::string
。到处都使用完整的名称通常会更好。在头文件的全局范围内,使用快捷方式甚至不再是样式问题,而是会导致真正的技术问题。
命名空间和 headers 是两个独立的概念,做着完全不同的事情:
- header
<string>
声明了与字符串库相关的各种实体,如 class 模板 std::basic_string
,一些 typedef
等 [=13] =] 和 std::wstring
,以及一些函数。
- 命名空间用于对相关功能进行分组,并允许在不同的命名空间中使用相同的名称。例如,"vector" 本质上是一些数组(这是在命名空间
std
中定义此名称的标准 C++ 库采用的视图),而在其他上下文中它是一个数学实体。
当您包含 <string>
时,您获得了与在命名空间 std
内声明的字符串库相关的所有实体。有些人 object 赞成使用 std::string
的想法,因为使用 string
更容易。为了帮助这种做法,using 指令,即在查找名称时,可以使用像 using namespace std;
这样的语句在命名空间 std
中查找实体。也就是说,using 指令只是使名称可以无限制地使用。
我知道 string
类型存在于 namespace std
中。我还知道需要包含 <string>
库才能使用 string
类型。我的问题是:为什么我需要两者(包括库和使用 std 命名空间)来定义字符串?为什么我不能通过包含库来使用它?更一般地说,namespace std
包含库中缺少的内容?
这样看:std::string
是类型的全名,很像"M. Kostas"是你的全名。
#include <string>
给你 std::string
。仅当您首先建立了正确的上下文时,您才可以将其称为 string
,例如通过 using namespace std
或 using std::string
,或者如果您自己恰好是 namespace std { /* ... */ }
.
再次考虑与姓氏的类比。如果我首先确定我在谈论 "Kostas" 家族 (= using namespace std
),或者如果我之前用 "M." 说过,我只能用 "M." 来称呼你我实际上是指 "M. Kostas" (= using std::string
) ,或者如果我自己是 "Kostas" 家族的成员 (= namespace std { /* ... */ }
).
请注意,您应该(至少包括我在内的许多程序员认为)很少使用 using namespace std
或 using std::string
。到处都使用完整的名称通常会更好。在头文件的全局范围内,使用快捷方式甚至不再是样式问题,而是会导致真正的技术问题。
命名空间和 headers 是两个独立的概念,做着完全不同的事情:
- header
<string>
声明了与字符串库相关的各种实体,如 class 模板std::basic_string
,一些typedef
等 [=13] =] 和std::wstring
,以及一些函数。 - 命名空间用于对相关功能进行分组,并允许在不同的命名空间中使用相同的名称。例如,"vector" 本质上是一些数组(这是在命名空间
std
中定义此名称的标准 C++ 库采用的视图),而在其他上下文中它是一个数学实体。
当您包含 <string>
时,您获得了与在命名空间 std
内声明的字符串库相关的所有实体。有些人 object 赞成使用 std::string
的想法,因为使用 string
更容易。为了帮助这种做法,using 指令,即在查找名称时,可以使用像 using namespace std;
这样的语句在命名空间 std
中查找实体。也就是说,using 指令只是使名称可以无限制地使用。