Используя директиву передовой опыт - PullRequest
3 голосов
/ 17 октября 2011

Есть ли какая-либо функциональная или оптимизационная разница между следующими?

// SomeClass.cpp
#include "SomeClass.h"
#include "SomeOtherClassInSomeClassNamespace.h"

using namespace SomeClassNamespace;

SomeClass::SomeClass() {}

void SomeClass::SomeFunc() 
{
    // uses some stuff in SomeClassNamespace not defined  in SomeClass.h
}

или

// SomeClass.cpp
#include "SomeClass.h"
#include "SomeOtherClassInSomeClassNamespace.h"

namespace SomeClassNamespace
{
    SomeClass::SomeClass() {}

    void SomeClass::SomeFunc() 
    {
        // uses some stuff in SomeClassNamespace not defined  in SomeClass.h
    }
}

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Есть ли функциональная разница между следующими?

Пока объединенные области разрешаются должным образом, тогда Нет .

Есть ли разница в оптимизации между следующими?

Время выполнения или двоичный размер? номер

Если вы хотите построить оптимизаций, то дополнительная сложность будет введена через using и / или путем повторного открытия пространства имен.

Я не использую первое, потому что разрешение может быть проблематичным.

Я не использую последнее, потому что легко получить новые объявления.

Как я его использую:

namespace {
  // ... private stuff
}

SomeClassNamespace::SomeClass::SomeClass() {}
...

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

1 голос
/ 17 октября 2011

Это только время, когда я когда-либо использую using namespace X;

И я удостоверяюсь, что единственное, что в файле - это определения классов внутри пространства имен X (итолько один урок за раз).

Единственная причина, по которой я делаю это таким образом, заключается в том, что (и личное мнение) я думаю, что это облегчает чтение в целом.И это документирует пространство имен, над которым мы работаем, одной строкой вверху (особенно если это многоуровневое вложенное пространство имен).

0 голосов
/ 17 октября 2011

Чтобы быть согласованным с namespace {, вы должны делать отступы в файле, что уменьшит количество фактического кода, который вы можете поместить в строку, прежде чем он прокрутится из поля зрения.

У вас этого нетпроблема с оператором using.

Вы также можете получить более запутанное сообщение об ошибке с параметром namespace {, поскольку закрывающая скобка для пространства имен может закрывать что-то еще, что не было правильно закрыто.Вы можете получить путающие сообщения о том, что в пространстве имен отсутствует закрывающая скобка.

Кроме этого, я не знаю никакой разницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...