Вы не добьетесь успеха, если будете самостоятельно использовать только пространства имен :) Все, что они делают (как следует из их названия), - предоставляют именованное пространство для типов, чтобы предотвратить загрязнение глобального пространства имен и предотвратить конфликт между идентичными именами типов.Поэтому для API характерно иметь внешнее пространство имен, содержащее все, что у него есть, тем самым предотвращая конфликты с другими API:
namespace MoosLibrary
{
typedef boost::uuids::uuid Uuid; // Moo's unique identifier!
};
namespace AnotherLibrary
{
typedef int Uuid; // this library uses integers for unique identifiers
};
В приведенном выше фрагменте без пространств имен два типа Uuid
будут конфликтовать, вызываянеисчислимые ошибки компиляции и царапины головы программирования.Однако, разделив их на отдельные пространства имен, мы можем избежать подобных конфликтов типов.Обратите внимание на приведенный выше пример boost::uuids::uuid
.Здесь есть два пространства имен. boost
- это библиотека C ++ boost (настоятельно рекомендуется, когда вы переходите на этот уровень C ++!), А uuids
- это пространство имен в boost, предназначенное для этой конкретной части библиотеки.
Таким образом, из этого видно, что пространства имен не только хороши для предотвращения конфликтов между типами, но также позволяют структурировать проекты в логические пространства имен, чтобы глобальное пространство имен не было полно типов.Это действительно удобно, если ваша IDE поддерживает intellisense.
namespace MoosLibrary
{
namespace Logic
{
// logic related classes/types
}
namespace UI
{
// user-interface
}
}
Примечание: detail
- это пространство имен, с которым связано неписаное правило.Это в основном то, где авторы API помещают материал, который должен быть публично видимым, но не облажаться.