【发布时间】:2011-02-22 15:40:09
【问题描述】:
我对正确使用 C++ 命名空间有点困惑。我很清楚它们如何帮助避免冲突(名称冲突),但对于 using 关键字就不清楚了。我的意思是,假设我将一部分代码放入命名空间并创建一个类,比如
namespace my
{
class vector { ... };
}
当然,当我使用它时,我不想一直输入my::vector,所以我想输入using namespace my。但是,我最终可能需要来自 std 命名空间的东西,然后我同时想要 using namespace std,但这会让我回到最初的名称冲突问题。
我知道可以只“导入”我需要的功能,例如using std::set,但在这种情况下,像我一样完全导入标准命名空间std 和my 命名空间似乎很自然。 d 一直使用它们。
这是否意味着即使我使用命名空间,我仍然应该考虑为我的类型赋予非通用名称?或者using namespace 是一个错误,我应该总是输入my::vector 来代替?谢谢。
好吧,我可能应该澄清一下,这更多的是可读性问题,而不是打字问题。很多:: 在我看来真的很奇怪。我知道这是品味和习惯的问题,但无论如何。
【问题讨论】:
-
"我不想一直输入
my::vector" 为什么不呢?完全限定名称(或对长名称空间名称使用名称空间别名)有助于使您的代码更清晰(无需猜测名称的来源)。它还可以帮助您避免在使用 using 指令(尤其是using namespace std;)时可能发生的有害名称查找问题。此类名称查找问题不会经常发生,但当它们确实发生时,它们可能难以诊断,而且我已经在 Stack Overflow 上回答了多个关于由 @ 引起的问题的难题987654335@. -
@James:主要动机不是打字,而是可读性。可能这是品味和习惯的问题,但目前到处都是
::真的让我更难阅读。 -
@James:在嵌套命名空间的情况下,情况会变得更糟,
my::db::helpers::class(随机示例,请不要太认真)对我来说真的很糟糕:) -
@7vies:你上一条评论的问题可以用
namespace dbhelp = my::db::helpers;解决 -
@7vies:它仍然比 my_db_helpers_class 更容易(因为命名空间别名和使用声明/指令),这是在没有命名空间的可管理代码中得到的。也就是说,我经常希望你可以在那里使用句点而不是双冒号。
标签: c++ namespaces