c++filt − Demangle C++ and Java symbols.
The C ++ and Java languages provide function overloading, which means that you can write many functions with the same name, providing that each function takes parameters of different types. In order to be able to distinguish these similarly named functions C ++ and Java encode them into a low-level assembler name which uniquely identifies each different version. This process is known as mangling. The c++filt  program does the inverse mapping: it decodes (demangles) low-level names into user-level names so that they can be read.
Every alphanumeric word (consisting of letters, digits, underscores, dollars, or periods) seen in the input is a potential mangled name. If the name decodes into a C ++ name, the C ++ name replaces the low-level name in the output, otherwise the original word is output. In this way you can pass an entire assembler source file, containing mangled names, through c++filt and see the same source file containing demangled names.
On some systems, both the C and C ++ compilers put an underscore in front of every name. For example, the C name "foo" gets the low-level name "_foo". This option removes the initial underscore. Whether c++filt removes the underscore by default is target dependent.
When demangling the name of a function, do not display the types of the function’s parameters.
Attempt to demangle types as well as function names. This is disabled by default since mangled types are normally only used internally in the compiler, and they can be confused with non-mangled names. For example, a function called "a" treated as a mangled type name would be demangled to "signed char".
the one used by the GNU C ++ compiler (g++) with the V3 ABI.
the one used by the GNU Ada compiler ( GNAT ).
MS-DOS does not allow "+" characters in file names, so on MS-DOS this program is named CXXFILT .