Описание тега name-mangling
Для этого тега подходят вопросы, касающиеся схем, используемых для искажения имен, проблем связывания при искажении, или инструментов, используемых для декодирования искаженных имен (например, 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, даже в мелких деталях, тогда они должны намеренно иметь разные схемы изменения имен, чтобы все ломалось очевидным, а не тонким образом.)