对于使用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
};
}
}
哪一个更好,为什么?
答案 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)如果你在标题中“使用命名空间”将它嵌套在另一个命名空间中(就像你的例子中那样),这样它就不会“泄漏”到包含标题的其他文件的范围内