Где С++ исходный код фильтра?

Кто-нибудь знает ссылку исходного кода С++. Я хочу, чтобы в моем коде была включена функция С++ С++ в качестве библиотеки.

Ответ 1

В Linux вы можете использовать /usr/include/demangle.h, который поставляется с пакетом binutils-dev. Вам нужно будет привязать к libiberty от binutils.

Ответ 3

Учитывая, что разные компиляторы могут калечить по-разному, каждый имеет тенденцию поставляться с пользовательским фильтром С++. Но в большинстве систем уже есть доступная функция библиотеки demangling. В моем ящике Linux я нашел заголовок /usr/include/c ++/version/cxxabi.h, определяющий __cxa_demangle() (см. http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html). Я думал, что раньше использовал какую-то другую функцию, но не могу найти детали (EDIT: возможно, версия demangle İsmail). В AIX есть demangle.h.

EDIT: в большинстве систем с программами pstack и С++ (например, Linux и Solaris) следующее должно работать...

#include <cstdio>
#include <iostream>
#include <sstream>

struct X
{
    void f()
    {
        std::ostringstream cmd;
        cmd << "pstack " << getpid() << " | c++filt";
        if (FILE* f = popen(cmd.str().c_str(), "r"))
        {
            char buffer[1024];
            int n;
            while ((n = fread(buffer, 1, sizeof buffer, f)) > 0)
                std::cout.write(buffer, n);
        }
        else
            std::cerr << "popen() failed\n";
    }
};

int main()
{
    X x;
    x.f();
}

... выход...

#0  0x003539be in __read_nocancel () from /lib/tls/i686/libc.so.6
#1  0x002ff590 in _IO_file_read_internal () from /lib/tls/i686/libc.so.6
#2  0x002fe522 in _IO_new_file_underflow () from /lib/tls/i686/libc.so.6
#3  0x00300371 in __underflow () from /lib/tls/i686/libc.so.6
#4  0x0030079d in _IO_default_xsgetn_internal () from /lib/tls/i686/libc.so.6
#5  0x00300733 in _IO_sgetn_internal () from /lib/tls/i686/libc.so.6
#6  0x002f666c in fread () from /lib/tls/i686/libc.so.6
#7  0x08048c36 in X::f ()
#8  0x08048ac0 in main ()

Обратите внимание, что __read_nocancel и т.д. НЕ являются идентификаторами С++: они являются только внутренними именами функций C, используя зарезервированные для -предупреждения: подчеркивание-верхний и верхний регистр или перекрестные ссылки с двойным подчеркиванием.

X::f() был искаженным идентификатором и был изменен.