我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?
当前回答
我认为本地或全球使用应取决于应用程序。
因为,当我们在本地使用库时,有时代码会变得一团糟。可读性将下降。
因此,只有在可能发生冲突时,我们才应该在本地使用库。
我不是一个更有经验的人。所以,如果我错了,请告诉我。
其他回答
我不认为这在任何情况下都是不好的做法,但在使用它时都需要小心。如果你正在编写一个库,你可能应该在命名空间中使用作用域解析运算符,以防止你的库与其他库冲突。对于应用程序级代码,我看不出它有什么问题。
您需要能够阅读与您不同风格和最佳实践意见的人编写的代码。如果你只使用cout,没有人会感到困惑。但是,当你有很多名称空间到处飞的时候,你看到这个类,你不太确定它做什么时,让名称空间显式充当某种注释。您可以第一眼看到,“哦,这是一个文件系统操作”或“这是在做网络工作”。
命名空间是命名作用域。命名空间用于对相关声明进行分组并保持独立项目分开。例如,两个单独开发的库可以使用相同的名称来表示不同的项,但用户仍然可以同时使用这两个:
namespace Mylib{
template<class T> class Stack{ /* ... */ };
// ...
}
namespace Yourlib{
class Stack{ /* ... */ };
// ...
}
void f(int max) {
Mylib::Stack<int> s1(max); // Use my stack
Yourlib::Stack s2(max); // Use your stack
// ...
}
重复名称空间名称可能会分散读者和作者的注意力。因此,有可能声明来自特定命名空间的名称在没有明确限定的情况下可用。例如:
void f(int max) {
using namespace Mylib; // Make names from Mylib accessible
Stack<int> s1(max); // Use my stack
Yourlib::Stack s2(max); // Use your stack
// ...
}
命名空间为管理不同库和不同版本的代码提供了强大的工具。特别是,它们为程序员提供了如何明确引用非本地名称的备选方案。
来源:C++编程语言概述作者:Bjarne Stroustrup
命名空间是为了避免命名冲突。C++基于C,C在函数和变量名方面有很多问题,因为有时来自不同库的函数会发生冲突。因此,库开发人员开始在其函数前面加上库名,如下所示:
foo/foo.h:
void libfoo_foo_foo_h_open(); // the name can be weird then even this one!
C++引入了名称空间,以一种简单的方式解决了这个问题。
假设您有两个名为file和window的库,分别处理文件和窗口,代码如下:
#include <file.h>
#include <window.h>
using namespace file;
using namespace window;
void open() {
...
}
文件.h:
namespace file {
void open(); // What!
}
window.h:
namespace window {
void open(); // Oh no!
}
上面的代码肯定无法编译。
如果你不喜欢键入std::(只有5个字符),你可以一直这样做:(在头文件中不是个好主意)
using s = std;
如果您仍然想使用名称空间std;在您的源文件中,那么您正在引发这个问题,我必须问您“NAMESPACE的目的是什么?”。
在类的头文件中使用名称空间的问题在于,它迫使任何想要使用您的类(通过包括头文件)的人也“使用”(即查看其他名称空间中的所有内容)。
但是,您可以随意在(私有)*.cpp文件中放入using语句。
请注意,有些人不同意我这样说的“感觉自由”,因为尽管cpp文件中的using语句比头文件中的要好(因为它不会影响包含头文件的人),但他们认为这仍然不好(因为根据代码的不同,这可能会使类的实现更难维护)。这个C++超级FAQ条目说,
using指令存在于遗留的C++代码中,用于简化向命名空间的转换,但您可能不应该定期使用它,至少不应该在新的C++代码。
常见问题解答建议了两种选择:
使用声明:使用std::cout;//using声明允许您无条件使用coutcout<<“值:”;只需键入std::std::cout<<“值:”;
推荐文章
- 为什么STL如此严重地基于模板而不是继承?
- 查找当前可执行文件的路径,不包含/proc/self/exe
- 未定义对静态constexpr char的引用[]
- 在c++中,restrict关键字是什么意思?
- c++中类似于java的instanceof
- include_directories和target_include_directories在CMake中的区别是什么?
- std::make_pair与std::pair的构造函数的目的是什么?
- 如何追加一个字符到std::字符串?
- 为什么要在c++中使用嵌套类?
- 如何处理11000行c++源文件?
- 使用g++编译多个.cpp和.h文件
- 如何在c++中追加文本到文本文件?
- 在c++中使用"super
- Mmap () vs.读取块
- 什么是不归路?