C ++“使用std :: <type>”vs每次调用std :: <type> </type> </type>

时间:2012-08-07 11:51:08

标签: c++ namespaces using

  

可能重复:
  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;

我被引导相信,也许这是不正确的,第一个有点要避免,因为它会给你的程序增加许多不必要的膨胀。但是,我不知道第二种和第三种风格在性能方面是否存在任何差异。我看到的大多数使用库的代码都倾向于使用第三种风格;但对我来说,如果在使用第二个方面没有任何权衡,它似乎是最干净,最易读的方法,特别是如果你对相关函数或对象进行了大量调用。

任何人都可以启发我吗?

4 个答案:

答案 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中实际使用的唯一名称是coutendl,因此编译代码中的最终结果是相同的。

优点和缺点是:

  1. 这个代码在大多数行中都会有更简洁的代码。阅读它的人可能必须更加关注coutendl的定义,尽管这并不是一件众所周知的事情。编译可能需要更长的时间,因为每个名称的可能含义范围稍大,但除非程序很大并且您编译的机器非常弱,否则这可能是微不足道的。如果范围内的某个其他命名空间定义了coutendl,那么该名称将是不明确的,并且您将被迫使用其中一个。

  2. 排名第一的好处,只有两个名字才能减少缺点。

  3. 与第一名相反。编辑器和开发人员在查看源代码时都没有歧义,但代价是更加冗长。

  4. 因此,如果这些是std在整个文件中的唯一用途,则可能值得采用方法3,如果重复使用std的大量内容,则为第一,如果您经常使用coutendl,但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