我对C++命名空间的正确使用有些困惑。很明显,它们可以帮助避免冲突(名称冲突),但是当涉及到using
关键字时,就不再清楚了。我的意思是,假设我将我的代码的一部分放入一个命名空间中,并创建一个类,比如说
namespace my
{
class vector { ... };
}
当我使用它时,我不想一直打 "my::vector",所以我想用 "using namespace my"。但是,我最终可能需要来自 "std" 命名空间的某些东西,这时我希望同时使用 "using namespace std",但这又会让我回到最初的命名冲突问题。
我知道可以只“导入”我需要的功能,比如 "using std::set",但在这种情况下,像我一样经常使用两个命名空间,完全导入标准命名空间 "std" 和 "my" 命名空间似乎更自然。
这是否意味着即使使用命名空间,我仍应考虑为我的类型命名非通用名称?还是说使用 "using namespace" 是一个错误,我应该始终打出 "my::vector"?谢谢。
嗯,我应该澄清一下,这更多是关于可读性而非输入的问题。到处都有 "::" 看起来对我来说很奇怪。我知道这是一个品味和习惯的问题,但无论如何。
my::vector
。为什么?完全限定名称(或者对于长的命名空间名字使用命名空间别名)有助于使您的代码更清晰易懂(没有猜测名称来自哪里)。它还可以帮助您避免使用using指令时可能发生的棘手名称查找问题(尤其是using namespace std;
)。这种名称查找问题不会经常发生,但当它们发生时,诊断起来可能很困难。我在Stack Overflow上回答过许多关于由using namespace std;
引起的问题的困难问题。 - James McNellis::
让我觉得阅读起来更加困难。 - Roman Lmy::db::helpers::class
(随意举例,请勿过于认真),在我看来真的很糟糕 :) - Roman Lnamespace dbhelp = my::db::helpers;
来解决。该语句为给命名空间my::db::helpers
起了一个别名dbhelp
,以便更方便地使用其中的函数和变量。 - Fred Foo