пространство имен в с ++ - PullRequest
       13

пространство имен в с ++

1 голос
/ 04 апреля 2010

какая польза от использования типа объявления пространства имен над использованием директивы типа пространства имен ?? когда использовать каждое из них?

Ответы [ 3 ]

2 голосов
/ 04 апреля 2010

Помимо объявления использования, разрешающего доступ к символу, а не к пространству имен, объявление использования также переносит символ в область действия объявления. Директива using влияет только на поиск.

2 голосов
/ 04 апреля 2010

Тип объявления директивы пространства имен вводит выбранные именованные символы в область действия code (и оставляет другие символы из того же пространства имен недоступными без квалификатора пространства имен).

Директива use type of namespace вводит все символы из пространства имен в область действия code - это означает, что вы не обязательно точно знаете, какие символы были введены (могли быть недокументированные символы или оставленные символы по сравнению с предыдущими версиями библиотеки, или ...).

  • Для управления используйте декларацию типа директивы пространства имен.
  • Для удобства (с риском) используйте директиву use type of namespace.
0 голосов
/ 04 апреля 2010

Джонатан уже возобновил различия между 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. На самом деле, этот самый совет можно найти в ряде книг:

Из Скотта Мейерса Действующий C ++ , пункт 26: Отложить определения переменных как можно дольше .

Из Херба Саттера и Андрея Александреску C ++ Стандарт кодирования , позиция 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;
}

В чем преимущества?

  • Псевдоним пространства имен> уменьшает почти столько же ввода, не вставляя типы прямо в текущую область, поэтому без риска
  • typedef> уменьшает количество набираемых текстов более чем на using и позволяет легко изменять базовый тип.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...