Использование «использования» в заголовочных файлах - PullRequest
5 голосов
/ 03 мая 2011

Я понял, что не должен использовать это в заголовочном файле:

using namespace foo;

Поскольку это приносит пространство имен foo в глобальную область видимости для всех, кто использует мой заголовочный файл.

Могу ли я предотвратить это, если я сделаю это в своем собственном пространстве имен? Например, как это:

namespace my_lib
{
    using namespace foo;

    // my stuff
    // ...
}

Теперь использование пространства имен foo должно быть ограничено областью имен my_lib, верно?

Ответы [ 2 ]

8 голосов
/ 03 мая 2011

Да.Это лучше, чем использовать using namespace foo на глобальном уровне.

Еще лучше, если вы используете синтаксис foo::name.

Теперь использование пространства имен foo должно быть ограниченов область имен my_lib, верно?

Да.Он приносит все имена из пространства имен foo в пространство имен my_lib, что может вызвать конфликт имен в my_lib.Вот почему foo::name является наиболее предпочтительным подходом.

0 голосов
/ 03 мая 2011

Да, если вы сделаете это, то просто перенесет все имена из foo в my_lib - что, как отмечали другие, может быть или не быть желательным.

Одна вещь, которую яВ дополнение к тому, что говорили другие, можно заметить, что вы можете использовать идею «использование директивы в пространстве имен» как способ имитации директивы использования, которая ограничена областью действия класса.Обратите внимание, что это незаконно:

class C
{
  using namespace boost; // for example

  // ...
};

Но вы можете сделать это вместо этого:

namespace C_Namespace {
  using namespace boost;

  class C
  {
  };
}

using C_Namespace::C; // bring C itself back into the global namespace

Просто подумал, что вы могли бы найти это полезным, если вы действительно хотите иметь возможность что-то определять(как класс) без записи определенного префикса пространства имен все время.

...