Как «использование пространства имен» работает в переполнении стека

Я пытаюсь понять пространства имен в C ++. Я прочитал, что есть два способа доступа к переменным и функциям пространства имен. Во-первых, написать с помощью :: а второй с помощью using директива сверху и не писать ее снова и снова. Я понял, что первый метод лучше, так как второй может привести к конфликтам.

Но я хочу знать, как на самом деле работает 2-й метод. Например, если я напишу using namespace std вверху, как компилятор знает, для каких функций он должен добавить std:: в начале и для каких он не имеет. Если я написал функцию в main, сначала она проверит мой основной файл для функции, а затем проверит в заголовочных файлах (которые я объявил вверху основного файла) для объявления функции. Теперь, насколько я понимаю, функции в std объявлены внутри пространств имен. Так что я не найду его, если буду искать без использования ::,

Итак, когда будет std:: получит добавить в начале функции?

-4

Решение

(Это упрощено, но это общая суть.)

Когда ты пишешь std::barкомпилятор не ищет что-то с именем «std :: bar», он ищет что-то с именем «bar» в пространстве имен «std».

using namespace std; заставляет компилятор искать имена как в текущем пространстве имен, так и в stdтак что для поиска «std :: bar» нигде не нужно добавлять «std ::» в любом месте — он будет найден при поиске «bar» внутри std а также в текущем пространстве имен.

0

Другие решения

Вот ссылка на описание того, как это работает: 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 может также применяться при поиске, где находится объявление функции.

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

0

По вопросам рекламы [email protected]