“使用命名空间标准”和“命名空间标准”之间的区别?
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 我认为这个问题已经解决了,所以我们不再需要那个黑客了。以上是关于“使用命名空间标准”和“命名空间标准”之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章