头文件中不使用using namespace?

时间:2022-09-08 10:03:48
头文件中不使用using namespace的原因是不是因为存在命名冲突的问题(在c的编程规范里看到的)?该怎么解决,有高手能解答吗?求。。。
能有比较具体的例子吗?

12 个解决方案

#1


C编程规范能看到命名空间知识也不错,这教材比较有超前意识。

#2


可以直接使用全名称,例如std::cout<<
可以百度一下,有很多这样的问题解释的

#3


把不该放到头文件里的内容另外做一个cpp文件。如果非要在头文件中使用的话如楼上~

#4


推荐使用域操作符~虽然麻烦一点,但是清晰~

#5


你知道为什么存在名称空间么?在名称空间出现之前,不同的库特别是大型软件之间常常发生全局对象命名冲突,名称空间的出现就是为了尽可能避免这个问题,不同的库放在不同的名称空间可以尽可能减少全局名称空间冲突的机会(虽然并没有完全解决问题)。

using namespace指示符的效果,是取消其修饰的名称空间的边界,使得其中的成员好像又重新放回了全局名称空间一样,它使得全局名称空间又重新受到了污染。

既然如此,为什么又要设计这个指示符呢?using namespace的设计其实是为了兼容名称空间出现之前的旧代码。这些旧代码没有使用名称空间,引用的标准库函数都没有std修饰,这些旧代码是无法在不进行修改的情况下在新编译器下编译的,但大量的修改也加大了代码重构的负担,为了使迁移更加容易进行,设计一个using namespace指示符使编译旧代码时能方便地一次去掉名称空间的边界,免去了大量的代码修改。


因此,一般而言,除非上述用途,是不应该使用using namespace指示符的,最严格的方式是使用qualified id,嫌不方便的话,也可以使用using指令,我是推荐使用using指令的。

#6


头文件中用using namespace XXX;会使所有包含该头文件的文件都被包含在名词空间XXX中。
在头文件中应该全部用XXX::。

#7


supermegaboy老大,能详细说一下qualified id吗?谢谢

#8


引用 7 楼 xjx_2004 的回复:
supermegaboy老大,能详细说一下qualified id吗?谢谢


老大就免了,又老又大才是 头文件中不使用using namespace?

qualified id就是大家平时使用的受限id,例如std::string之类。

#9


引用 1 楼 mougaidong 的回复:
C编程规范能看到命名空间知识也不错,这教材比较有超前意识。

++
namespace  c里面的意思是   两个不同类型的同名参数吧?

#10


多谢!

#11


避免不了的话,可以使用using std::vector类似的方式,不用把namespace全部包含。。

#12


引用 5 楼 supermegaboy 的回复:
你知道为什么存在名称空间么?在名称空间出现之前,不同的库特别是大型软件之间常常发生全局对象命名冲突,名称空间的出现就是为了尽可能避免这个问题,不同的库放在不同的名称空间可以尽可能减少全局名称空间冲突的机会(虽然并没有完全解决问题)。

using namespace指示符的效果,是取消其修饰的名称空间的边界,使得其中的成员好像又重新放回了全局名称空间一样,它使得全局名称空间又重新受到了污染。……



具体可参考C++Primer

#1


C编程规范能看到命名空间知识也不错,这教材比较有超前意识。

#2


可以直接使用全名称,例如std::cout<<
可以百度一下,有很多这样的问题解释的

#3


把不该放到头文件里的内容另外做一个cpp文件。如果非要在头文件中使用的话如楼上~

#4


推荐使用域操作符~虽然麻烦一点,但是清晰~

#5


你知道为什么存在名称空间么?在名称空间出现之前,不同的库特别是大型软件之间常常发生全局对象命名冲突,名称空间的出现就是为了尽可能避免这个问题,不同的库放在不同的名称空间可以尽可能减少全局名称空间冲突的机会(虽然并没有完全解决问题)。

using namespace指示符的效果,是取消其修饰的名称空间的边界,使得其中的成员好像又重新放回了全局名称空间一样,它使得全局名称空间又重新受到了污染。

既然如此,为什么又要设计这个指示符呢?using namespace的设计其实是为了兼容名称空间出现之前的旧代码。这些旧代码没有使用名称空间,引用的标准库函数都没有std修饰,这些旧代码是无法在不进行修改的情况下在新编译器下编译的,但大量的修改也加大了代码重构的负担,为了使迁移更加容易进行,设计一个using namespace指示符使编译旧代码时能方便地一次去掉名称空间的边界,免去了大量的代码修改。


因此,一般而言,除非上述用途,是不应该使用using namespace指示符的,最严格的方式是使用qualified id,嫌不方便的话,也可以使用using指令,我是推荐使用using指令的。

#6


头文件中用using namespace XXX;会使所有包含该头文件的文件都被包含在名词空间XXX中。
在头文件中应该全部用XXX::。

#7


supermegaboy老大,能详细说一下qualified id吗?谢谢

#8


引用 7 楼 xjx_2004 的回复:
supermegaboy老大,能详细说一下qualified id吗?谢谢


老大就免了,又老又大才是 头文件中不使用using namespace?

qualified id就是大家平时使用的受限id,例如std::string之类。

#9


引用 1 楼 mougaidong 的回复:
C编程规范能看到命名空间知识也不错,这教材比较有超前意识。

++
namespace  c里面的意思是   两个不同类型的同名参数吧?

#10


多谢!

#11


避免不了的话,可以使用using std::vector类似的方式,不用把namespace全部包含。。

#12


引用 5 楼 supermegaboy 的回复:
你知道为什么存在名称空间么?在名称空间出现之前,不同的库特别是大型软件之间常常发生全局对象命名冲突,名称空间的出现就是为了尽可能避免这个问题,不同的库放在不同的名称空间可以尽可能减少全局名称空间冲突的机会(虽然并没有完全解决问题)。

using namespace指示符的效果,是取消其修饰的名称空间的边界,使得其中的成员好像又重新放回了全局名称空间一样,它使得全局名称空间又重新受到了污染。……



具体可参考C++Primer