Создание пространства имен С++ в заголовке и источнике (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;
}
}
Если нет никакой разницы, какая предпочтительная форма и почему?
Ответы
Ответ 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, иначе вы рискуете использовать объекты из другого пространства имен, которые могут вызвать множество проблем.