如何使用"使用" C ++中的关键字

时间:2017-05-25 17:20:25

标签: c++

对于使用using C ++关键字作为命名空间的更好方法,我感到很困惑。假设以下代码位于头文件backtrace.h

#include <memory>
using my_namespace1::component1;
using my_namespace2::component2;
namespace my_application {
  namespace platform_logs {
    class backtrace_log {
          //code that creates instances of my_namespace1::component1 and my_namespace2::component2
    };
  }
}

OR

#include <memory>    
namespace my_application {
  namespace platform_logs {
    using my_namespace1::component1;
    using my_namespace2::component2;

    class backtrace_log {
          //code that creates instances of my_namespace1::component1 and my_namespace2::component2
    };
  }
}

哪一个更好,为什么?

3 个答案:

答案 0 :(得分:8)

您应该始终从 narrow 范围内的其他命名空间中提取符号(不污染外部命名空间),通常只需提取特定的符号需要,而不仅仅是整个命名空间。

标题(可能被许多用户包含)中,您通常应该完全避免这种做法,而是选择始终只对类型使用显式名称空间限定。< / p>

答案 1 :(得分:4)

在头文件中......以下示例为 evil 。切勿在头文件的全局范围内使用using namespace...。如果用户符号与其他标题发生冲突,它会强制用户使用批次来解决问题。

#include <memory>
using my_namespace1::component1;
using my_namespace2::component2;
namespace my_application {
  namespace platform_logs {
    class backtrace_log {
          //code that creates instances of my_namespace1::component1 and my_namespace2::component2
    };
  }
}

另一方面,下一个例子很好,但要谨慎使用。只有当您希望您的 API中包含所有这些符号时才有意义。这通常是内部项目名称空间的情况,但第三方名称空间的可能性较小。

我会特别避免使用像std::这样的非常大的命名空间。

#include <memory>    
namespace my_application {
  namespace platform_logs {
    using my_namespace1::component1;
    using my_namespace2::component2;

    class backtrace_log {
          //code that creates instances of my_namespace1::component1 and my_namespace2::component2
    };
  }
}

答案 2 :(得分:2)

在你的第一个例子中包含

   backtrace.h

在另一个文件中该文件也将使用这些名称。因此,如果有人在某个文件中写了“blax”,其中包含了backtrace.h,而“blax”也恰好是你名称空间中的类或函数,例如:

my_namespace1::component1::blax

编译器可能会将他的“blax”改为“my_namespace1 :: component1 :: blax”

通过将using命名空间放在另一个命名空间中,您只需将所有这些定义包含在该命名空间中,在前面的示例中,如果您使用的代码的第二版自“my_namespace1 :: component1 :: blax”后不会发生冲突“将包含在my_application :: platform_logs :: blax。

总体而言,大多数编码指南都会鼓励您: a)不希望“使用命名空间”或至少使用它来缩短(例如使用short_namespace = first_namespace :: another_namepsace :: last_namespace)

b)如果你使用“使用命名空间”在源文件(即.cpp或.c文件)中这样做,因为这些文件中的定义不包括在内

c)如果你在标题中“使用命名空间”将它嵌套在另一个命名空间中(就像你的例子中那样),这样它就不会“泄漏”到包含标题的其他文件的范围内