可能重复:
Using std Namespace
Why is 'using namespace std;' considered a bad practice in C++?
假设我在C ++中使用#include <iostream>
并且我正在制作一个打印语句。我可以选择:
using namespace std;
[...]
cout << "Hello" << endl;
或
using std::cout;
using std::endl;
[...]
cout << "Hello" << endl;
或
std::cout << "Hello" << std::endl;
我被引导相信,也许这是不正确的,第一个有点要避免,因为它会给你的程序增加许多不必要的膨胀。但是,我不知道第二种和第三种风格在性能方面是否存在任何差异。我看到的大多数使用库的代码都倾向于使用第三种风格;但对我来说,如果在使用第二个方面没有任何权衡,它似乎是最干净,最易读的方法,特别是如果你对相关函数或对象进行了大量调用。
任何人都可以启发我吗?
答案 0 :(得分:9)
无论您选择哪种方式,都没有性能差异或“臃肿”。
但是,如果你这样做,例如
using namespace std;
using namespace boost;
在两个名称空间中,如果名称冲突,你会遇到很多麻烦。
我认为版本3,在所有地方使用std::cout
等,更容易阅读,并使您免于未来的名称冲突。
如果这不是你想要的,那么选项2是第二好的,因为它只从命名空间中引入了一些选择名称。请注意,在您的示例中,输入中存在净损失,因为使用声明包含的更多字符比您在其余部分中不键入std::
所节省的数字要多代码。
答案 1 :(得分:8)
我的经验法则:永远不要将using namespace
放在.h中,但可以在.cpp
文件中使用它。特别是当它是using namespace std
!
答案 2 :(得分:4)
每个产生的代码应完全相同。第一个不会有任何膨胀,因为它只是在编译时使std
的所有名称都可用于代码 - 未使用的内容未被使用。 std
中实际使用的唯一名称是cout
和endl
,因此编译代码中的最终结果是相同的。
优点和缺点是:
这个代码在大多数行中都会有更简洁的代码。阅读它的人可能必须更加关注cout
和endl
的定义,尽管这并不是一件众所周知的事情。编译可能需要更长的时间,因为每个名称的可能含义范围稍大,但除非程序很大并且您编译的机器非常弱,否则这可能是微不足道的。如果范围内的某个其他命名空间定义了cout
或endl
,那么该名称将是不明确的,并且您将被迫使用其中一个。
排名第一的好处,只有两个名字才能减少缺点。
与第一名相反。编辑器和开发人员在查看源代码时都没有歧义,但代价是更加冗长。
因此,如果这些是std
在整个文件中的唯一用途,则可能值得采用方法3,如果重复使用std
的大量内容,则为第一,如果您经常使用cout
和endl
,但std
没有其他内容。
或者你可以一直使用数字1,除非被歧义强迫去做。
这两者并不相互排斥。人们可以这样做:
using namespace std;
/*...*/
std::cout << "Hello" << std::endl;
这里当然std::
是多余的,但如果这些在上下文中含糊不清,我们可能会这样做,但std
的其他用法不是,或者如果人们可能不熟悉具有特定名称,因此冗余代码有助于提高可读性。还有一些名称通常以这种方式给出了全名,并且做一些常见的事情本身就是对可读性的帮助。
但是,除非出现歧义(不会编译),所有这些都会在编译时生成相同的程序。
编辑:
我在这里假设一个.cpp文件,但我同意其他关于标题的文件。在一个.h文件中,你强制决定它所包含的所有文件,并且只需一个就有一个不明确的地方来做坏事。它对开发人员来说也不太明显,因为包含的位置不在使用地点附近。
如果你真的想在.h文件中使用1或2,那么将using
放在命名空间,类或函数中来限定范围,这样就不会有任何惊喜等待包括文件。
答案 3 :(得分:3)
我通常会优先考虑第三种风格,但有时使用第一种或第二种风格会更加紧凑和简单。我有时在本地使用它们。例如:
void foo()
{
using namespace std;
//do stuff
}
但我不想在模块
中全局写using namespace std