Описание тега name-mangling

Изменение имен - это метод, используемый компиляторами (в основном компиляторами C++) для кодирования информации в строках, которые могут поддерживаться компоновщиками, предназначенными для обработки кода C.

Для этого тега подходят вопросы, касающиеся схем, используемых для искажения имен, проблем связывания при искажении, или инструментов, используемых для декодирования искаженных имен (например, C++ filter или dem).

В C++ изменение имен используется для кодирования таких вещей, как пространство имен символа и / или подпись функции.

Например, с учетом этого кода C++:

namespace Foo {
namespace Bar {
    class A {
        public:
            A();
            ~A();
    };
}

int f(int i)
{
    Bar::A a;
}

int f(double d)
{
    Bar::A a;
}

}

компилятор g ++ в системе Linux может сгенерировать следующие "искаженные" имена для двух перегрузок f() и конструктора и деструктора A:

  • _ZN3Foo1fEd
  • _ZN3Foo1fEi
  • _ZN3Foo3Bar1AC1Ev
  • _ZN3Foo3Bar1AD1Ev

Используя такой инструмент, как C++ filter, мы можем расшифровать эти имена:

$ echo _ZN3Foo1fEd | c++filt
Foo::f(double) 

$ echo _ZN3Foo3Bar1AC1Ev | c++filt
Foo::Bar::A::A() 

Конечно, если вы не используете g ++ в Linux, искаженная форма ваших символов может (скорее всего, БУДЕТ) отличаться. (C++ FAQ lite тонко предполагает, что если два компилятора C++ имеют разные ABI, даже в мелких деталях, тогда они должны намеренно иметь разные схемы изменения имен, чтобы все ломалось очевидным, а не тонким образом.)