Компилятор C , реализующий пространство имен

#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 нуждается в уникальных именах функций.