Создание пространства имен C++ в заголовке и источнике (cpp)
есть ли разница между переносом содержимого заголовка и файла 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 ответов:
пространство имен-это просто способ исказить сигнатуру функции, чтобы они не конфликтовали. Некоторые предпочитают первый способ, а другие предпочитают второй вариант. Обе версии не оказывают никакого влияния на производительность времени компиляции. Обратите внимание, что пространства имен-это просто объект времени компиляции.
единственная проблема, которая возникает с использованием пространства имен, когда у нас есть те же имена вложенных пространств имен (т. е.)
X::X::Foo. Это создает больше путаницы с или без использования ключевого слова.
разница в " пространстве имен X "и" использование пространства имен X " заключается в том, что в первом случае любые новые объявления будут находиться под пространством имен, а во втором-нет.
в вашем примере нет нового объявления-так что нет разницы, следовательно, нет предпочтительного способа.
там нет штрафов за производительность, так как результат может быть таким же, но положить ваш
Fooв пространство имен неявно вводит двусмысленность в случае, если у вас естьFoos в разных пространствах имен. Вы можете получить свой код 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; }
Comments