Подтвердить что ты не робот

Создание пространства имен С++ в заголовке и источнике (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;
  }
} 

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

4b9b3361

Ответ 1

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

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

Ответ 2

Разница в "пространстве имен X" на "использование пространства имен X" находится в первом, все новые объявления будут находиться под пространством имен, а во втором - нет.

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

Ответ 3

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

И у вас есть блуждающий { после using namespace; -)

Ответ 4

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

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

Ответ 5

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

Ответ 6

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