Есть ли разница между переносом содержимого файла заголовка и 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;
}
}
Если нет разницы, какая форма предпочтительнее и почему?
источник
Нет никаких штрафов за производительность, так как результат может быть таким же, но размещение вашего
Foo
в пространстве имен неявно вводит двусмысленность, если у вас естьFoo
s в разных пространствах имен. Вы действительно можете получить свой код fubar. Я бы рекомендовал избегать использованияusing
для этой цели.А у вас заблудший
{
послеusing namespace
;-)источник
}
в самом конце. Однако я бы назвал эту пару скобок излишней;)Если второй компилируется, отличий быть не должно. Пространства имен обрабатываются во время компиляции и не должны влиять на действия во время выполнения.
Но что касается дизайна, второй вариант ужасен. Даже если он компилируется (не уверен), в этом нет никакого смысла.
источник
{
;-)Foo :: TheFunc () не находится в правильном пространстве имен в случае VS. Используйте void X :: Foo :: TheFunc () {}, чтобы реализовать функцию в правильном пространстве имен (X).
источник
В случае, если вы оберните только содержимое .h, которое вы должны написать, используя пространство имен ... в файле cpp, иначе вы каждый раз будете работать с допустимым пространством имен. Обычно вы оборачиваете файлы .cpp и .h, иначе вы рискуете использовать объекты из другого пространства имен, что может вызвать множество проблем.
источник
Я думаю, что здесь правильно использовать пространство имен для определения объема.
namespace catagory { enum status { none, active, paused } }; void func() { catagory::status status; status = category::active; }
источник
Если вы пытаетесь использовать переменные из одной в другую, я бы рекомендовал их экстернализировать, а затем инициализировать их в исходном файле следующим образом:
// [.hh] namespace example { extern int a, b, c; } // [.cc] // Include your header, then init the vars: namespace example { int a, b, c; } // Then in the function below, you can init them as what you want: void reference { example::a = 0; }
источник