Компилятор C ++, реализующий пространство имен - PullRequest
2 голосов
/ 09 июня 2011

С точки зрения компилятора C ++, пространство имен - это просто соглашение об украшении имен?Я проверил сгенерированный список сборок и обнаружил, что все выглядит одинаково, за исключением того, что идентификаторы украшены именем пространства имен.

Ответы [ 4 ]

2 голосов
/ 09 июня 2011

Как вы указали, искажение имен - это часть истории (но причины для этого больше связаны с компоновщиками, а не с компиляторами).

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

0 голосов
/ 09 июня 2011

Не случайно первый компилятор C ++, написанный Бьярном Страуструпом, назывался CFront .Он преобразовал код C ++ в C и передал его компилятору C.Поэтому я считаю, что это просто искажение имен для создания уникальных символов для перегрузки и предотвращения конфликтов имен (пространство имен)

0 голосов
/ 09 июня 2011

Насколько я знаю, что это такое. Описание можно найти под именем искажение: http://en.wikipedia.org/wiki/Name_mangling

0 голосов
/ 09 июня 2011

С точки зрения компилятора 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.
      }
  }
}
...