#c #compiler-construction #namespaces #implementation #name-decoration
#c #компилятор-построение #пространства имен #реализация #название-оформление
Вопрос:
С точки зрения компилятора C , является ли пространство имен просто соглашением об оформлении имен? Я проверил сгенерированный список сборок и обнаружил, что все выглядит одинаково, за исключением того, что идентификаторы оформлены именем пространства имен.
Комментарии:
1. Но чего еще вы ожидали? 🙂 В конце концов, это пространство имен .
2. ДА. И в чем вопрос?
Ответ №1:
Как вы указали, искажение имен является частью истории (но причины для этого больше связаны с компоновщиками, а не с компиляторами).
Однако искажение имен — это далеко не вся история, связанная с обработкой пространств имен в компиляторе. Среди прочего, компилятор должен быть способен вычислять неквалифицированные имена, которые могут быть нетривиальными: см. Поиск, зависящий от аргумента.
Ответ №2:
Насколько я знаю, так оно и есть. Описание можно найти под названием «искажение»: http://en.wikipedia.org/wiki/Name_mangling
Ответ №3:
С точки зрения компилятора C , является ли пространство имен просто соглашением об оформлении имен?
Я думаю, да. Это просто оформление имени в конце.
Для этого компилятор выполняет множество действий. При разрешении имени он выбирает правильное пространство имен, возможно, из многих.
Например,
namespace X
{
void f(); //compiler chooses X only when decorating f()
namespace Y
{
void f(); //compiler chooses X and Y when decorating f()
void g() //compiler chooses X and Y when decorating g()
{
f(); //which f? Compiler decorates it with both X and Y.
X::f(); //which f? Compiler decorates it with X only.
}
}
}
Комментарии:
1. Разве пространство имен не имеет какой-то области видимости? Потенциально у вас могло бы быть два класса с одинаковым именем, но пространство имен предотвращает столкновение.
Ответ №4:
Не случайно, что первый компилятор C , написанный Бьярне Страуструпом, назывался CFront. Он преобразовал код C в C и передал его компилятору C. Итак, я считаю, что это просто искажение имени, чтобы создать уникальные символы для перегрузки и избежать конфликтов имен (пространство имен)
Комментарии:
1. В CFront не было пространств имен.
2. @neil: Я согласен, но концепция существовала в виде классов с одноименными функциями, следовательно, им требовалось искажение имен, поскольку C нуждается в уникальных именах функций.