我听说过使用名称空间std;这是不好的做法,我应该直接使用std::cout和std::cin。这是为什么?声明与std命名空间中的某个变量同名的变量是否有风险?
当前回答
同时使用多个命名空间显然是一个灾难,但在我看来,使用JUST命名空间std和仅使用命名空间std并不是什么大问题,因为重新定义只能由您自己的代码进行。。。
因此,只需将它们的函数视为保留名称,如“int”或“class”即可。
人们不应该对此如此吹毛求疵。你的老师一直都是对的。只需使用一个名称空间;这就是首先使用名称空间的全部意义。您不应该同时使用多个。除非它是你自己的。因此,再次定义不会发生。
其他回答
是的,名称空间很重要。在我的项目中,我需要将一个var声明导入到源代码中,但在编译时,它与另一个第三方库冲突。
最后,我不得不用其他方法来解决这个问题,并使代码变得不那么清晰。
有经验的程序员使用任何解决他们问题的方法,避免任何产生新问题的方法。出于这个确切的原因,他们避免使用头文件级别的指令。
经验丰富的程序员也尽量避免在源文件中使用完全限定的名称。这样做的一个次要原因是,除非有充分的理由,否则在代码较少的情况下编写更多的代码是不优雅的。一个主要原因是关闭参数依赖查找(ADL)。
这些好理由是什么?有时程序员明确希望关闭ADL,有时他们希望消除歧义。
因此,以下内容是可以的:
函数级使用指令并在函数的实现中使用声明使用源文件内声明的源文件级别(有时)使用指令的源文件级别
很高兴看到代码并知道它做什么。如果我看到std::cout,我知道这是std库的cout流。如果我看到cout,我不知道。它可能是std库的cout流。或者有一个int cout=0;在同一函数中高出十行。或该文件中名为cout的静态变量。它可能是任何东西。
现在以一百万行代码库为例,它不是特别大,你正在搜索一个bug,这意味着你知道在这一百万行代码中有一行没有完成它应该做的事情;可以读取名为cout的静态int,将其向左移动一位,然后丢弃结果。要找bug,我必须检查一下。你能看出我真的更喜欢看std::cout吗?
如果你是一名教师,并且从未以编写和维护代码为生,那么这是一个非常好的主意。我喜欢看到代码:(1)我知道它做什么;而且,(2)我相信写它的人知道它的作用。
为了回答你的问题,我实际上是这样看的:很多程序员(不是所有人)都调用命名空间std。因此,人们应该养成习惯,不要使用与命名空间std中的名称冲突或使用相同名称的东西。这是一个很大的事实,但与严格来说可能出现的连贯单词和假名的数量相比,这并不是那么多。
我是说真的。。。说“不要依赖于这个存在”只是让你依赖于它不存在。您经常会遇到借用代码片段并不断修复它们的问题。只需将用户定义的和借用的内容保持在有限的范围内,并且非常节省全局变量(老实说,全局变量几乎永远是“现在编译,以后理智”的最后手段)。我真的认为这是你老师的坏建议,因为使用std对“cout”和“std::cout”都有效,但不使用std只对“std:”cout有效。你不会总是幸运地编写自己的代码。
注意:在真正了解编译器的工作原理之前,不要过于关注效率问题。只要有一点编码经验,在你意识到他们能够将好的代码概括成简单的东西之前,你不必了解他们太多。每一点都很简单,就像你用C语言写了整件事一样。
考虑
// myHeader.h
#include <sstream>
using namespace std;
// someoneElses.cpp/h
#include "myHeader.h"
class stringstream { // Uh oh
};
请注意,这是一个简单的示例。如果您有包含20个include和其他导入的文件,那么您将有大量的依赖项来解决问题。更糟糕的是,根据冲突的定义,在其他模块中可能会出现不相关的错误。
这并不可怕,但如果不在头文件或全局名称空间中使用它,您将省去麻烦。在非常有限的范围内执行它可能是正确的,但我从未遇到过键入额外的五个字符来澄清我的函数来自何处的问题。
推荐文章
- 输入对象的datetime。Datetime没有Datetime属性
- cbegin/cend背后的原因是什么?
- 如何在Eclipse CDT中启用c++ 11/ c++ 0x支持?
- 将string (or char*)转换为wstring (or wchar_t*)
- 如何停止c++控制台应用程序从退出立即?
- 有没有替换Windows (Visual C)的unistd.h ?
- 目标文件中无法解析的外部符号
- Lambda捕获作为const引用?
- 如何从c风格数组初始化std::vector ?
- 是std::vector复制对象push_back?
- 为什么在c++ 11中使用非成员begin和end函数?
- 如何通过参数和重定向stdin从一个文件到程序运行在gdb?
- 为什么两个不同的概念都叫“堆”?
- 为什么这个结合赋值和相等检查的if语句返回true?
- cplusplus.com给出的错误、误解或坏建议是什么?