【发布时间】:2011-10-21 20:05:29
【问题描述】:
using关键字的这两种用法有什么区别:
using boost::shared_ptr;
和
using namespace boost;
【问题讨论】:
标签: c++ namespaces using-declaration
using关键字的这两种用法有什么区别:
using boost::shared_ptr;
和
using namespace boost;
【问题讨论】:
标签: c++ namespaces using-declaration
using boost::shared_ptr;
仅包括当前命名空间中 boost 命名空间中的 shared_ptr。
这意味着您可以使用shared_ptr 而不用命名空间boost 限定它。
它被称为使用声明。
using namespace boost;
包括您当前范围内boost 命名空间中的所有符号。
这意味着您可以使用boostnamespace 中的所有符号,而无需使用命名空间boost 限定它们。
它被称为使用指令。
为什么你总是更喜欢using declaration 而不是using directive?
使用第一个 (using declaration) 并避免使用第二个 (using directive) 总是更好,因为第二个会导致 命名空间污染 将潜在的大量名称引入当前命名空间,其中许多是不必要的。不必要的名称的存在大大增加了意外名称冲突的可能性。
引用Herb Sutterusing directive的用法:
我觉得将using directive 视为一支由疯狂的野蛮人组成的掠夺性大军会很有帮助,他们在所到之处播下不分青红皂白的破坏——即使你在认为你与它结盟。
【讨论】:
using namespace 广泛用于例如标准库头文件。在这种情况下,污染是故意的。
debug/debug.h(这是一个实现细节)使用了 using namespace 指令,另一方面,using声明被使用超过 1000 次。
swap的情况类中的函数:struct X { int d; void swap( X& other ) { using std::swap; swap( d, other.d ); } 是正确的,而将 using 声明 替换为 using 指令 将无法编译。
using,我同意。另一方面,如果您的意思是有时首选using namespace,我同意Als。
using namespace boost 使 boost 命名空间中的所有名称都可见,无需限定using boost::shared_ptr 只是让shared_ptr 可见,无需限定。【讨论】:
第一个叫using declaration;
第二个叫using directive。
引用 MSDN:
注意 using 指令和 using 之间的区别 声明:
using 声明允许单独的名称 无条件使用,
using 指令允许所有名称 在一个命名空间中,无需限定即可使用。
【讨论】:
第一个只允许您使用名称 shared_ptr 没有 boost:: 前缀。第二个允许您在没有 boost:: 前缀的情况下使用 boost 命名空间中的任何和所有名称。有些人不赞成后者,但它从来没有给我带来任何问题。
【讨论】: