Я пытаюсь понять пространства имен в C ++. Я прочитал, что есть два способа доступа к переменным и функциям пространства имен. Во-первых, написать с помощью ::
а второй с помощью using
директива сверху и не писать ее снова и снова. Я понял, что первый метод лучше, так как второй может привести к конфликтам.
Но я хочу знать, как на самом деле работает 2-й метод. Например, если я напишу using namespace std
вверху, как компилятор знает, для каких функций он должен добавить std::
в начале и для каких он не имеет. Если я написал функцию в main, сначала она проверит мой основной файл для функции, а затем проверит в заголовочных файлах (которые я объявил вверху основного файла) для объявления функции. Теперь, насколько я понимаю, функции в std объявлены внутри пространств имен. Так что я не найду его, если буду искать без использования ::
,
Итак, когда будет std::
получит добавить в начале функции?
(Это упрощено, но это общая суть.)
Когда ты пишешь std::bar
компилятор не ищет что-то с именем «std :: bar», он ищет что-то с именем «bar» в пространстве имен «std».
using namespace std;
заставляет компилятор искать имена как в текущем пространстве имен, так и в std
так что для поиска «std :: bar» нигде не нужно добавлять «std ::» в любом месте — он будет найден при поиске «bar» внутри std
а также в текущем пространстве имен.
Вот ссылка на описание того, как это работает: http://en.cppreference.com/w/cpp/language/unqualified_lookup.
Более общий обзор начинается здесь (http://en.cppreference.com/w/cpp/language/lookup) и показывает вам все случаи, когда у вас есть квалифицированные имена против неквалифицированных имен.
Обратите внимание, что разрешение имен в C ++ на самом деле довольно сложно. Зависимый от аргумента поиск (ADL) http://en.cppreference.com/w/cpp/language/adl может также применяться при поиске, где находится объявление функции.
Также компилятору может потребоваться выполнить разрешение перегрузки, поскольку может быть несколько функций, но с разным количеством аргументов, и эти перегрузки могут существовать в разных пространствах имен.