What does "using namespace" do exactly?(3个答案)2年前关闭。
using namespace std;
这句话的作用是什么?这是否具有"包含"的相同功能?
kq0g1dla1#
c++中的一个概念是命名空间,它以某种方式组织代码。using namespace std;现在要做什么?让我们通过示例来探索这个问题。
c++
#include <iostream> int main() { std::cout << "Hello World" << std::endl; // important line return 0; }
你可以在注解行看到std关键字,这叫做命名空间,所以你告诉编译器,你想使用命名空间std中的cout。使用using namespace std;
std
cout
#include <iostream> using namespace std; int main() { cout << "Hello World" << endl; // important line return 0; }
在那里你告诉编译器,在这个作用域中打开std命名空间。所以你可以使用cout而不使用std::。这可能会被误认为是更有效的编码。但是你会在某个时候遇到问题。在命名空间std中定义了成百上千个函数或者常量等等,大多数时候你不会去管这些,但是如果你在一个地方定义了一个同名同参数的函数,你几乎找不到错误。例如,有std::find。可能有机会你定义了相同的函数。这种情况下的编译器错误是一个痛苦的问题。所以我强烈建议您使用using namespace std;。
std::
std::find
j8ag8udp2#
它不是“include”的同一个函数。此语句允许您访问std命名空间中定义的任何类、函数或类型,而无需在类或函数名称前键入“std::“。示例:如果要在std命名空间中声明字符串类型的变量不使用“”,使用命名空间std;“
#include <string> ... std::string str1; std::string str2;
with“使用命名空间std;“
#include <string> using namespace std; ... string str1; string str2
ckocjqey3#
using指令using namespace std使命名空间std中的名称成为当前作用域中使用的匹配名称的候选。例如,在
using namespace std
#include <vector> using namespace std; int main() { vector<int> v; }
名称vector存在于命名空间std中(作为模板类)。在main()中,当它看到名称vector的用法时,以前的using namespace std会导致编译器在std中查找与vector匹配的名称。它找到std::vector,因此使用-,然后v具有实际类型std::vector<int>。using指令与预处理器#include的功能不同。在上面的代码中,#include <vector>被替换为带有标准头文件<vector>内容的预处理器。该头文件的内容声明了模板化的std::vector类及其相关内容。如果从上面的示例中删除#include <vector>,并保留using namespace std,则代码将不会编译,因为编译器看不到<vector>的内容。相反,如果删除using namespace std但保留#include <vector>,则代码将无法编译,因为名称vector位于名称空间std中,并且不会在该名称空间中搜索与vector匹配的名称。当然,您可以将上面的代码更改为
vector
main()
std::vector
v
std::vector<int>
#include
#include <vector>
<vector>
#include <vector> int main() { std::vector<int> v; }
在这种情况下,std::vector的使用显式地告诉编译器在名称空间std中查找名称vector。在某些情况下,使用using namespace std也是不可取的,但我将把了解这一点作为一项练习。
3条答案
按热度按时间kq0g1dla1#
c++
中的一个概念是命名空间,它以某种方式组织代码。using namespace std;
现在要做什么?让我们通过示例来探索这个问题。你可以在注解行看到
std
关键字,这叫做命名空间,所以你告诉编译器,你想使用命名空间std
中的cout
。使用
using namespace std;
在那里你告诉编译器,在这个作用域中打开
std
命名空间。所以你可以使用cout
而不使用std::
。这可能会被误认为是更有效的编码。但是你会在某个时候遇到问题。在命名空间
std
中定义了成百上千个函数或者常量等等,大多数时候你不会去管这些,但是如果你在一个地方定义了一个同名同参数的函数,你几乎找不到错误。例如,有std::find
。可能有机会你定义了相同的函数。这种情况下的编译器错误是一个痛苦的问题。所以我强烈建议您使用using namespace std;
。j8ag8udp2#
它不是“include”的同一个函数。此语句允许您访问std命名空间中定义的任何类、函数或类型,而无需在类或函数名称前键入“std::“。
示例:如果要在std命名空间中声明字符串类型的变量
不使用“”,使用命名空间std;“
with“使用命名空间std;“
ckocjqey3#
using指令
using namespace std
使命名空间std
中的名称成为当前作用域中使用的匹配名称的候选。例如,在
名称
vector
存在于命名空间std
中(作为模板类)。在main()
中,当它看到名称vector
的用法时,以前的using namespace std
会导致编译器在std
中查找与vector
匹配的名称。它找到std::vector
,因此使用-,然后v
具有实际类型std::vector<int>
。using指令与预处理器
#include
的功能不同。在上面的代码中,#include <vector>
被替换为带有标准头文件<vector>
内容的预处理器。该头文件的内容声明了模板化的std::vector
类及其相关内容。如果从上面的示例中删除
#include <vector>
,并保留using namespace std
,则代码将不会编译,因为编译器看不到<vector>
的内容。相反,如果删除
using namespace std
但保留#include <vector>
,则代码将无法编译,因为名称vector
位于名称空间std
中,并且不会在该名称空间中搜索与vector
匹配的名称。当然,您可以将上面的代码更改为
在这种情况下,
std::vector
的使用显式地告诉编译器在名称空间std
中查找名称vector
。在某些情况下,使用
using namespace std
也是不可取的,但我将把了解这一点作为一项练习。