【问题标题】:Why is std:: used by experienced coders rather than using namespace std;? [duplicate]为什么有经验的编码人员使用 std:: 而不是使用命名空间 std;? [复制]
【发布时间】:2011-07-25 01:16:54
【问题描述】:

可能重复:
Why is 'using namespace std;' considered a bad practice in C++?

前几天我问了一个问题,有人回答说如果有人问问题,请向他们展示正确的方法,而不是 using namespace std;,我认为这有点奇怪,因为 using namespace std;方式 更容易,但我想我现在失败了,因为我是一个“初学者”编码器,你们知道得更好。

所以我想我的问题是: 为什么是std:: 而不是using namespace std;

谢谢。

【问题讨论】:

标签: c++ namespaces std using-directives


【解决方案1】:

来自 C++ 常见问题解答:

我应该在我的代码中使用using namespace std吗?

可能不会。

人们不喜欢在上面输入std:: 一遍又一遍,他们发现 using namespace std 让编译器看到 任何std 名称,即使不合格。这 美中不足的是它让 编译器看到 any std 名称,甚至 那些你没有想到的。在 换句话说,它可以创建名称 冲突和歧义。

https://isocpp.org/wiki/faq/coding-standards#using-namespace-std

【讨论】:

  • 是否有任何效率提升或者这不是问题?
  • @chustar:“效率”是什么意思?
  • 我的意思是选择是否包含命名空间会影响程序的速度或大小或编译时间吗?
  • 这都是在编译过程中完成的,生成的机器码没有区别。
  • @chustar:使用std::foo 编译可能会快一点,因为已解决歧义。但我认为这并不重要。
【解决方案2】:

命名空间是我们变量的附加限定符。假设我们在std 中定义了“字符串”,现在如果我们在mynamespace 中定义了一个“字符串”。

现在,如果我在文件顶部写using namespace std;,那么从那里开始,一个字符串对于编译器来说就会变得模棱两可。

但是,可以采取中间方法,在 header(.h) 文件中严格不包含 using namespace std;,因为其他人可能想要使用您的类并且可能会发生冲突。而对于一个实现(.cxx)文件,如果你确定不会有任何冲突,你可以小心使用它。

【讨论】:

    【解决方案3】:

    经验丰富的程序员使用能解决问题的方法,避免产生新问题的方法。

    因此,出于显而易见的原因,他们避免使用头文件级使用指令。

    并且他们试图避免在源文件中完全限定名称。 次要的一点是,当更少的代码足够时编写更多的代码并不优雅没有充分的理由。重点是关闭 ADL。

    这些充分的理由是什么?有时您明确希望关闭 ADL。有时您想消除歧义。

    以下是可以的: 1) 函数实现中的函数级 using-directives 和 using-declarations; 2) 源文件中的源文件级使用声明; 3)(有时)源文件级使用指令。

    【讨论】:

      【解决方案4】:

      我认为这是一种偏好。有些人喜欢在使用类时看到显式的命名空间。 一个例外是我从不在头文件中使用 using namespace std。因为这可能会意外地改变正在使用此头文件的类的行为。

      【讨论】:

        【解决方案5】:

        我认为经验丰富的程序员不会使用显式命名空间,例如Do you prefer explicit namespaces or 'using' in C++?

        但是请注意,您永远不应该在头文件中导入命名空间,并且在某些情况下显式命名空间会更清晰,例如使用函数 std::min()std::max()

        【讨论】:

          【解决方案6】:

          简单地说,您不太可能错误地使用错误的类型或函数,或者名称冲突。假设您正在使用自己的数学库和 std,并以任意顺序使用它们两者进行声明。现在,它们都定义了函数 pow。当您调用 pow 时,您使用的是哪个 pow?我认为额外的打字是值得的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-19
            • 2020-06-06
            • 1970-01-01
            • 2015-10-05
            • 1970-01-01
            相关资源
            最近更新 更多