【问题标题】:C++ using keywordC++ 使用关键字
【发布时间】:2011-10-21 20:05:29
【问题描述】:

using关键字的这两种用法有什么区别:

using boost::shared_ptr;

using namespace boost;

【问题讨论】:

    标签: c++ namespaces using-declaration


    【解决方案1】:
    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 视为一支由疯狂的野蛮人组成的掠夺性大军会很有帮助,他们在所到之处播下不分青红皂白的破坏——即使你在认为你与它结盟。

    【讨论】:

    • 是的,必须的,因为它显着减少了命名空间污染。
    • @DeadMG using namespace 广泛用于例如标准库头文件。在这种情况下,污染是故意的。
    • @David:快速搜索 gcc 4.2 中的标准头文件发现只有 debug/debug.h(这是一个实现细节)使用了 using namespace 指令,另一方面,using声明被使用超过 1000 次。
    • @Als:答案漏掉了一些细节,我懒得去找所有的都去查标准,不过可以考虑以会员身份实现swap的情况类中的函数:struct X { int d; void swap( X& other ) { using std::swap; swap( d, other.d ); } 是正确的,而将 using 声明 替换为 using 指令 将无法编译。
    • @David Heffernan:如果“不一定”是指有时最好完全避免使用using,我同意。另一方面,如果您的意思是有时首选using namespace,我同意Als。
    【解决方案2】:
    • using namespace boost 使 boost 命名空间中的所有名称都可见,无需限定
    • using boost::shared_ptr 只是让shared_ptr 可见,无需限定。

    【讨论】:

      【解决方案3】:

      第一个叫using declaration

      第二个叫using directive

      引用 MSDN:

      注意 using 指令和 using 之间的区别 声明:

      using 声明允许单独的名称 无条件使用,

      using 指令允许所有名称 在一个命名空间中,无需限定即可使用。

      【讨论】:

        【解决方案4】:

        第一个只允许您使用名称 shared_ptr 没有 boost:: 前缀。第二个允许您在没有 boost:: 前缀的情况下使用 boost 命名空间中的任何和所有名称。有些人不赞成后者,但它从来没有给我带来任何问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-05
          • 2011-12-04
          相关资源
          最近更新 更多