“使用命名空间标准”和“命名空间标准”之间的区别?

Posted

技术标签:

【中文标题】“使用命名空间标准”和“命名空间标准”之间的区别?【英文标题】: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; 有什么区别?

【问题讨论】:

【参考方案1】:

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

声明

using namepace std;

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

一些补充说明:

    标准明确指出,向 std 命名空间添加内容会导致未定义的行为,这不仅是一种不好的做法,而且超出了标准。有关详细讨论,请参阅 Adding types to the std namespace。 在 *.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 我认为这个问题已经解决了,所以我们不再需要那个黑客了。

以上是关于“使用命名空间标准”和“命名空间标准”之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

C++命名空间与缺省参数

C++命名空间与缺省参数

C++命名空间与缺省参数

从链表 C++ 中删除节点

返回后如何访问函数堆栈内存? [复制]

G++ 和 Clang++ - 命名空间标准 _GLIBCXX_VISIBILITY(默认)