Name mangling
The compiler encoding an entire signature — namespace, class, parameter types, qualifiers — into a single symbol name, because linkers only understand flat names.
It is the mechanism that makes overloading possible: f(int) and f(double) become two different symbols and can therefore coexist. Two consequences dominate everyday life. First, the encoding is compiler-specific and part of the binary interface, which is why object files from incompatible compilers cannot be linked together, and why the split of the string type in libstdc++ produced years of baffling errors about missing symbols. Second, extern "C" turns mangling off and produces a plain name, which is required for anything to be called from C or looked up dynamically at runtime. The tools c++filt and nm -C translate back, which is how you actually read a linker error.