STLPORT: Что означает пространство имен std {}? - PullRequest
7 голосов
/ 28 февраля 2012

В библиотеке stlport я увидел этот код:

namespace std { }
namespace __std_alias = std;

1. Они пытаются обнулить стандартное пространство имен std в первой строке?
2. Почему в мире они используют более длинное псевдоним вместо исходного имени?

Ответы [ 4 ]

8 голосов
/ 28 февраля 2012

Вам нужно пространство имен "в области видимости", прежде чем вы сможете объявить ему псевдоним.Пустой namespace std {} сообщает компилятору о существовании пространства имен.Затем они могут создать псевдоним для него.

Существуют причины для создания псевдонимов помимо создания ярлыка.Например, вы можете определить макрос для «переименования» пространства имен - рассмотрите эффект #define std STLPORT_std.Наличие псевдонима позволяет получить доступ к исходному пространству имен при условии, что вы играете в игры с правильным упорядочением с заголовочными файлами.

3 голосов
/ 28 февраля 2012
  1. Нет, это просто гарантирует, что имя пространства имен доступно в текущей области. Вы можете открывать и закрывать пространства имен в любой точке, не затрагивая содержимое пространства имен.

  2. Я бы догадался, чтобы они могли легко изменить реализацию своей библиотеки, чтобы она находилась в пространстве имен, отличном от ::std (изменяя __std_alias на псевдоним чего-то еще). Это было бы полезно, например, если вы хотите протестировать две реализации рядом друг с другом.

2 голосов
/ 28 февраля 2012

Довольно неприятно получить ошибку компилятора, что нет такого пространства имен, как std ... Что думает компилятор? Конечно, он существует!

Что ж, да, но как и в случае с библиотечными функциями, оно должно быть объявлено первым. Это то, что делает первая строка.

С переименованием __std_alias это позволяет им дать новый псевдоним пространству имен. Вы можете решить сделать это когда-нибудь в своем собственном коде.

Возможно, вы хотите использовать shared_ptr в своем коде, но не хотите выделять свой код для использования увеличения пространства имен или std. Таким образом, вы можете создать псевдоним и указать его на boost или std. То же самое с другими функциями, которые есть в библиотеках boost, которые позже стали стандартными.

Это не связывает вас с использованием этого пространства имен для всего, поскольку вы можете иметь более одного псевдонима, и вы можете иметь более одного, указывающего на одно и то же реальное пространство имен.

Допустим, мы хотим вызвать нашу библиотеку умных указателей sml. Мы можем сделать

namespace sml = boost; // or std

в одном месте кода и #include <boost/shared_ptr.hpp> с этой точки в коде (тот же заголовок).

В любом другом месте нашего кода мы используем sml::shared_ptr. Если мы когда-нибудь переключимся с boost на std, просто измените один заголовок, а не весь код.

0 голосов
/ 28 февраля 2012

В дополнение к тому, что сказал Д.Шоули, для объявления класса, который находится внутри пространства имен, требуется такой же синтаксис:

namespace std
{
    template <typename T>
    class vector;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...