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


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

617   7  

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

    Ничего не найдено.