Использование C++ для std и boost передового опыта

Возможный дубликат:
Вы предпочитаете явные пространства имен или "использование" в C++?

Привет, ребята, я разработчик на C#, но мой друг на C++, и он показал мне код, который заполнен вызовами вроде std::for_each и boost::bind, я привык использовать в C#, и подумал, что использование директив будет качаться для удобочитаемости кода и, как правило, более быстрой разработки, было бы затруднительно набирать любое пространство имен, например, перед оператором C# foreach.

Какие плюсы и минусы использования для таких популярных пространств имен мне интересно? Лучше ли включать эти пространства имен или нет?

2 ответа

Решение

Прежде всего, давайте сделаем два различия:

1) Есть такие директивы, как using namespace std; и используя объявления как using std::cout;

2) Вы можете поместить директивы и объявления в заголовок (.h) или в файл реализации (.cpp).

Кроме того, использование директив и объявлений приводит имена в пространство имен, в котором они написаны, т.е.

namespace blah
{
    using namespace std; // doesn't pollute the *global* namespace, only blah
}

Теперь, с точки зрения наилучшей практики, ясно, что размещение директив и объявлений в заголовочном файле в глобальном пространстве имен - это ужасно нет-нет. Люди будут ненавидеть вас за это, потому что любой файл, содержащий этот заголовок, будет иметь загрязненное глобальное пространство имен.

Размещение директив и объявлений в файлах реализации несколько более приемлемо, хотя это может сделать или не сделать код менее понятным. В целом, вы должны предпочесть использование объявлений использованию директив в таких случаях. Я предпочитаю всегда указывать пространство имен, если только оно не слишком раздражающее (тогда я могу испытать искушение).

В заголовке, если ввод пространства имен каждый раз становится действительно утомительным, вы всегда можете ввести "локальное" пространство имен, например

namespace MyLocalName
{
    using namespace boost;

    class X
    {
        // can use things from boost:: here without qualification
    };
}

using MyLocalName::X; // brings X back into the global namespace

Но никогда не ставлю using namespace boost; или эквивалент где-нибудь, где он будет перетаскивать весь материал из Boost в собственное глобальное пространство имен для других людей.

Я против using namespace операторы, за исключением, может быть, локально в теле функции. Нетрудно писать полное пространство имен перед каждым идентификатором, за исключением случаев, когда вы пишете как 500 loc в день.

Другие вопросы по тегам