How is it that we can overload a function to accept different input parameters in a language like C++? How does the compiler represent different entities with the same identifier?
In the compiler construction, languages like C++ encode information into symbol names to contain information such as parameter types and return types.
This enables support for features such as overloading and bug detection - to check for things like the wrong assignment of types or wrong inputs etc.
Simple Example
Two C++ functions defined named f()
:
int f () { return 1; } int f (int) { return 0; } void g () { int i = f(), j = f(0); }
These are distinct functions, with no relation to each other apart from the name. The C++ compiler will therefore encode the type information in the symbol name, the result being something resembling:
int __f_v () { return 1; } int __f_i (int) { return 0; } void __g_v () { int i = __f_v(), j = __f_i(0); }
Even though its name is unique, g()
is still mangled: name mangling applies to all C++ symbols (those not in an extern "C"{}
block).
To avoid name mangling in C++, define symbols in an extern "C"{}
block. This interprets the block as C code rather than C++.