Создание пространства имен C ++ в заголовке и источнике (cpp) - PullRequest
74 голосов
/ 21 ноября 2011

Есть ли разница между переносом содержимого заголовка и файла cpp в пространство имен или переносом только содержимого заголовка, а затем с использованием пространства имен в файле cpp?

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

Пример:

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
namespace X
{
  void Foo::TheFunc()
  {
    return;
  }
}

VS

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
using namespace X;
{
  void Foo::TheFunc()
  {
    return;
  }
} 

Если естьбез разницы какая форма предпочтительнее и почему?

Ответы [ 7 ]

44 голосов
/ 21 ноября 2011

Разница между «пространством имен X» и «использованием пространства имен X» заключается в том, что первые объявления будут находиться под пространством имен, а во втором - нет.

В вашем примере нет нового объявления, поэтому нет никакой разницы, следовательно, нет предпочтительного способа.

33 голосов
/ 21 ноября 2011

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

Единственная проблема, которая возникает при использовании пространства имен, - это когда у нас одинаковые вложенные имена пространств имен (т.е.) X::X::Foo. Это создает путаницу с использованием или без использования ключевого слова.

7 голосов
/ 21 ноября 2011

Производительность не снижается, поскольку результат может быть одинаковым, но помещение вашего Foo в пространство имен неявно вносит двусмысленность в случае, если у вас Foo s в разных пространствах имен. Вы можете получить свой код Fubar, действительно. Я бы рекомендовал избегать использования using для этой цели.

А у вас шальная { после using namespace; -)

1 голос
/ 21 ноября 2011

Foo :: TheFunc () не находится в правильном пространстве имен в случае VS. Используйте 'void X :: Foo :: TheFunc () {}', чтобы реализовать функцию в правильном пространстве имен (X).

1 голос
/ 21 ноября 2011

Если второй компилируется, различий не должно быть. Пространства имен обрабатываются во время компиляции и не должны влиять на действия во время выполнения.

Но из-за проблем с дизайном второе ужасно. Даже если он компилируется (не уверен), он вообще не имеет смысла.

0 голосов
/ 16 сентября 2018

Я думаю, что здесь правильно использовать пространство имен для определения области действия.

namespace catagory
{
    enum status
    {
      none,
      active,
      paused
    }
};

void func()
{
    catagory::status status;
    status = category::active;
}
0 голосов
/ 21 ноября 2011

В случае, если вы заключаете в оболочку только содержимое .h, которое вы должны написать, используя пространство имен ... в файле cpp, в противном случае вы каждый раз работаете с действительным пространством имен. Обычно вы оборачиваете файлы .cpp и .h, иначе вы рискуете использовать объекты из другого пространства имен, что может вызвать много проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...