c ++中的命名空间

时间:2010-04-04 00:43:50

标签: c++ namespaces

使用命名类型的命名空间比使用命令类型的命名空间有什么用?何时使用它们中的每一个?

3 个答案:

答案 0 :(得分:2)

namespace命令的声明类型将选定的命名符号引入 code 范围(并且在没有命名空间限定符的情况下,使相同命名空间中的其他符号不可访问)。

namespace命令的using类型将命名空间中的所有符号引入 code 范围 - 这意味着您不一定确切地知道引入了哪些符号(可能有未记录的符号或符号)从以前版本的库中遗留下来,或者......)。

  • 对于控件,请使用namespace命令的声明类型。
  • 为方便起见(有风险),请使用命名空间指令的使用类型。

答案 1 :(得分:2)

除了允许访问符号而不是命名空间的using声明之外,using声明还将符号带到声明的范围。 using指令仅影响查找。

答案 2 :(得分:0)

Jonathan已经恢复了using namespace foo;using foo::Bar;之间的差异,但我认为他的回答很不幸。

首先:using namespace不应出现在头文件中。通过这样做,您可能会因为符号冲突而无法与其他头文件一起使用...

第二:一般来说,你应该尽可能地限制符号的范围,你可能已经在编写代码时这样做了:

for (size_t i = 0; i < 5; ++i)
{
  std::string myString = myVec.at(i);
  if (myString == "Foo") { std::cout << "Found"; break; }
}

myString循环之外声明for将是无用的(和污染)。事实上,这些建议可以在很多书中找到:

来自Scott Meyers的Effective C++,第26项:尽可能推迟变量定义

来自Herb Sutter和Andrei Alexandrescu的C++ Coding Standard,第18项:尽可能在本地声明变量

没有理由不对using声明做同样的事情。

第三:考虑using的替代方案:命名空间别名和typedef

// foo.h

class Foo
{
public:

  std::vector<std::string> getSynonyms(const std::string& s) const;

private:
  typedef std::map< std::string, std::vector<std::string> > synonyms_type;
  synonyms_type mSynonyms;
};

// foo.cpp (never in header, at general scope)

namespace fu = boost::fusion;

std::vector<std::string> Foo::getSynonyms(const std::string& s) const
{
  synonyms_type::const_iterator it =
    std::find(mSynonyms.begin(), mSynonyms.end(), s);

  std::vector<std::string> result;
  if (it != mSynonyms.end()) { result = it->second; }

  return result;
}

有什么好处?

  • 命名空间别名&gt;在没有注入当前范围内的类型的情况下,几乎同样减少打字,这样就没有风险了
  • typedef&gt;减少超过using的输入,并允许轻松更改基础类型。