Должен ли я обернуть весь мой код C ++ в свое собственное пространство имен? - PullRequest
26 голосов
/ 02 февраля 2009

Я пришел из c # фона, где у всего есть свое собственное пространство имен, но эта практика кажется необычной в мире c ++. Должен ли я обернуть мой код в его собственное пространство имен, безымянное пространство имен или без пространства имен?

Ответы [ 8 ]

35 голосов
/ 02 февраля 2009

Многие разработчики C ++ не используют пространства имен, к сожалению. Когда я начинал с C ++, я не использовал их долгое время, пока не пришел к выводу, что могу лучше использовать пространства имен.

Многие библиотеки работают с пространствами имен, помещая префиксы перед именами. Например, wxWidgets ставит символы «wx» перед всем. Qt ставит "Q" перед всем. В этом нет ничего плохого, но требуется, чтобы вы набирали этот префикс заново, даже если это можно сделать из контекста, какие объявления вы имеете в виду. Пространства имен имеют иерархический порядок. Имена, которые лексически ближе к той точке, на которую они ссылаются, находятся ранее. Таким образом, если вы ссылаетесь на «Окно» в вашей среде графического интерфейса, оно найдет «my :: gui :: Window» вместо «:: Window».

Пространства имен включают некоторые приятные функции, которые нельзя использовать без них. Например, если вы поместите свой класс в пространство имен, вы можете определить свободные функции в этом пространстве имен. Затем вы вызываете функцию, не помещая пространство имен вперед, импортируя все имена или выборочно только некоторые из них в текущую область («используя объявление»).

В настоящее время я больше не делаю никаких проектов, не используя их. Они позволяют легко не вводить один и тот же префикс заново, но при этом имеют хорошую организацию и избегают загрязнения имен в глобальном пространстве имен.

11 голосов
/ 02 февраля 2009

Зависит от того, если ваш код является библиотечным кодом, пожалуйста, поместите его в пространства имен, это практикуется в C ++. Если ваш код является очень простым приложением, которое не взаимодействует ни с чем другим, например, с приложением типа hello world, вам не нужны пространства имен, потому что это избыточно.

И поскольку пространства имен не требуются, фрагменты кода и примеры в Интернете редко используют их, но большинство реальных проектов используют их.

4 голосов
/ 28 сентября 2009

Я только что обнаружил руководство по стилю Google c ++, и у них рекомендации по пространству имен.

Весь путеводитель стоит прочитать, но, подытоживая, они говорят:

  • Добавление безымянных пространств имен в файлы .cc, но не в файлы .h.
  • Обертывание целых (после включения / объявлений) файлов .cc и .h в именованные пространства имен.
  • Пространства имен не увеличивают уровень отступа.
  • В закрывающей скобке для пространства имен напишите } // namespace.
  • Не объявляйте ничего в std, потому что оно не определено.
  • Использование директивы using запрещено.
  • объявление using разрешено в функциях, методах и классах.
  • псевдонимы пространства имен разрешены везде.
2 голосов
/ 02 февраля 2009

У нас были проблемы с переносом кода в управляемый C ++, который использует здесь наши общие библиотеки.

Некоторые классы имели те же имена, что и класс System в библиотеке .NET (т.е. System.Console).
Чтобы обойти эти проблемы, нам пришлось сделать несколько некрасивых макросов.

Использование пространств имен в начале предотвратило бы это.

2 голосов
/ 02 февраля 2009

Это действительно зависит от того, ожидаете ли вы каких-либо конфликтов.

Два сценария;

1) Если вы создаете код, который может использоваться другими (например, библиотеками), то могут возникнуть конфликты пространства имен, поэтому использование собственного пространства имен - хорошая идея.

2) Если вы используете сторонние библиотеки, их код может не иметь пространств имен и конфликтовать с вашим.

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

1 голос
/ 29 сентября 2009

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

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

1 голос
/ 02 февраля 2009

но эта практика, кажется, необычный в мире c ++

Действительно. Весь код, который я вижу, обернут в пространство имен.
Я использую соглашение того же типа, что и в Java (за исключением того, что я опускаю ком)

В Java

package com.<Company>.<Product>.<Package>;

В С ++

namespace <Company>
{
     namespace <Product>
     {
         namespace <Package>
         {
         }
     }
 }
1 голос
/ 02 февраля 2009

Пространства имен действительно нужны, только если есть риск конфликта имен - некоторые глобально видимые функции или переменные или классы определяются более одного раза. В противном случае у вас все получится без пространства имен - просто назовите ваши классы, чтобы они не дублировали классы библиотек времени выполнения и сделали глобальные функции / переменные статическими членами некоторых разумных классов.

...