【问题标题】:Difference between "using namespace std" and "namespace std"?“使用命名空间标准”和“命名空间标准”之间的区别?
【发布时间】:2014-05-23 11:58:47
【问题描述】:

这是我的代码:

#ifndef DATE_H_
#define DATE_H_

namespace std {

class Date {
    public:
       Date();
       virtual ~Date();
    };

} /* namespace std */

#endif /* DATE_H_ */

我为我的作业创建了课程 Date,它创建了 namespace std{......}。我不知道它的用途。 为什么没有像往常一样写use namespace std; 有什么区别?

【问题讨论】:

    标签: c++


    【解决方案1】:

    您的代码在命名空间 std 中声明您的类 Date,即您的类完全限定名称是 std::Date

    声明

    using namepace std;
    

    搜索符号时将包含命名空间std。

    一些补充说明:

    1. 标准明确指出,向 std 命名空间添加内容会导致未定义的行为,这不仅是一种不好的做法,而且超出了标准。有关详细讨论,请参阅 Adding types to the std namespace
    2. 在 *.h(或包含在多个文件中的任何内容)上使用 using namespace 不是一个好习惯...因为它可能会产生意外的副作用,符号解析为错误的命名空间。

    【讨论】:

    • 这不仅仅是坏习惯:它是被禁止的。
    • @LightnessRacesinOrbit 用您的建议完善了答案。
    【解决方案2】:

    首先:永远不要在 std 命名空间中放置任何东西。

    namespace foo
    {
      class A {};
    }
    

    将类A放在命名空间foo中,所以它的全名是foo::A

    using namespace foo;
    

    表示您可以访问foo 中的所有内容,而无需使用限定符foo::
    请注意,using namespace 通常不受欢迎,可能会导致许多意想不到的问题。
    最重要的是,不要写在标题中。

    如果你说

    using namespace foo;
    
    class A{};
    

    A 不在foo 内,而是在全局命名空间中。

    【讨论】:

    • 从技术上讲,您可能希望将 std::swap 的特化放在 std 命名空间中。
    • @ChrisDrew 我认为这个问题已经解决了,所以我们不再需要那个黑客了。
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2023-03-26
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多