Предпочтительный синтаксис пространства имен для исходных файлов - PullRequest
2 голосов
/ 18 ноября 2008

Предполагая класс с именем Bar в пространстве имен с именем foo, какой синтаксис вы предпочитаете для исходного файла (.cpp / .cc)?

namespace foo {
...
void Bar::SomeMethod()
{
    ...
}

} // foo

или

void foo::Bar::SomeMethod()
{
    ...
}

Я интенсивно использую пространства имен и предпочитаю первый синтаксис, но при добавлении кода с помощью мастера классов Visual Studio (обработчики WM_COMMAND и т. Д.) Автоматически сгенерированный код использует второй. Есть ли преимущества одного синтаксиса перед другим?

Ответы [ 4 ]

6 голосов
/ 18 ноября 2008

Я бы отказался от первого ( изменить : вопрос изменился, первое - это то, что я тоже предпочитаю сейчас). Поскольку неясно, на что ссылается Бар, нужно смотреть только на определение функции. Кроме того, при использовании first метода могут отображаться ошибки с ошибками:

namespace bar { 
     struct foo { void f(); };
}

namespace baz { 
    struct foo { void f(); };
}

using namespace bar;
using namespace baz;

void foo::f() { // which foo??

}

Поскольку он смотрит в текущей области (там это глобальная область), он находит два foo и говорит, что ссылка на него неоднозначна.

Лично я бы сделал это так:

namespace foo {
void Bar::SomeMethod() {
    // something in here
}
}

Также не ясно только из определения SomeMethod, к какому пространству имен оно принадлежит, но у вас есть область имен вокруг него, и вы можете легко найти его. Кроме того, теперь ясно, что Bar относится к пространству имен foo.

Второй способ, которым вы показываете, будет слишком много печатать для меня. Кроме того, второй способ может вызвать путаницу среди новых читателей вашего кода: foo - это класс, а Bar - его вложенный класс? Или foo - это пространство имен, а Bar - класс?

5 голосов
/ 18 ноября 2008

Я предпочитаю вариант, которого нет в списке:

namespace foo {

void Bar::SomeMethod()
{
    ...
}

}  // foo namespace

В отличие от первого варианта, это делает очевидным, что ваш код принадлежит пространству имен foo, а не просто использует его. В отличие от второго варианта, это экономит много печатать. Беспроигрышный.

2 голосов
/ 19 ноября 2008

Я бы предпочел перейти к первому случаю, когда пространства имен явно помечены:

namespace TheNamespace {
void TheClass::TheMethod() {
   // code
}
}

Причина в том, что из этого синтаксиса ясно, что TheClass является классом, а TheNamespace - пространством имен (не столь очевидным ни для каких других имен). Если код был

void TheNamespace::TheClass::TheMethod() {
   // code
}

тогда читатель не может ясно увидеть, является ли TheNamespace пространством имен или классом с внутренним классом по имени TheClass.

class TheClass1
{
   class TheClass2
   {
      void TheMethod();
   }
};

void TheClass1::TheClass2::TheMethod() {
   // code
}

Я стараюсь избегать оператора using, и даже в этом случае пример с litb с двумя классами в двух разных пространствах имен приведет в замешательство как компилятор, так и программиста, и его следует избегать.

1 голос
/ 18 ноября 2008

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

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