Подтвердить что ты не робот

Должен ли я обернуть весь свой код на С++ в свое собственное пространство имен?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Я только что открыл руководство по стилю Google С++, и они правила пространства имен.

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

но эта практика, похоже, необычный в мире С++

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

В Java

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

В С++

namespace <Company>
{
     namespace <Product>
     {
         namespace <Package>
         {
         }
     }
 }

Ответ 8

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

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