How can i avoid name mangling?

How can I avoid name mangling in C++?


Solution 1:

You can't. It's built into compilers to allow you overloading functions and to have functions with the same name in different classes and such stuff. But you can write functions that are mangled like C functions. Those can be called from C code. But those can't be overloaded and can't be called by "normal" C++ function pointers:

extern "C" void foo() {

}

The above function will be mangled like C functions for your compiler. That may include no change at all to the name, or some changes like a leading "_" in front of it or so.

Solution 2:

Other way:

Controlling Names Used in Assembler Code (gcc spec.)

You can specify the name to be used in the assembler code for a C function or variable by writing the asm (or __asm__) keyword after the declarator. It is up to you to make sure that the assembler names you choose do not conflict with any other assembler symbols, or reference registers.

To specify the assembler name for functions, write a declaration for the function before its definition and put asm there, like this:

 int func () asm ("MYFUNC");

 int func ()
 {

g++ will compile it and nm -D output will be

0000000000001e02 T MYFUNC

instead of

0000000000001e02 T _Z4funcv

Tested on g++ 4.9.2

Solution 3:

You mean so you can export your function from a library? extern "c" { your code here }

Solution 4:

Schaub's answer is factually incorrect. The most common reason to avoid name mangling is because you are building a shared library (on Windows, a DLL) that is used by client software you don't control that expects certain exported function names. Because of mangling differences between compilers, such interfaces have historically avoided name mangling.

What you have to do is this. First, in your source code prepend extern "C" to get rid of C++ mangling; this still leaves C mangling though. Second, use the -Wl,--kill-at command line option when compiling.

Example:

extern"C" __declspec(dllexport) hresult __stdcall MyExportedFunction( ... )
{
     ....
}

And compile with:

gcc -shared -mwindows -Wl,--kill-at -Werror ... -o MyLib.dll MyLib.cpp -lkernel32 -l...

You can verify whether you got it right using Dependency Walker.