Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

questions about name mangling in C++

I am trying to learn and understand name mangling in C++. Here are some questions:

(1) From devx

When a global function is overloaded, the generated mangled name for each overloaded version is unique. Name mangling is also applied to variables. Thus, a local variable and a global variable with the same user-given name still get distinct mangled names.

Are there other examples that are using name mangling, besides overloading functions and same-name global and local variables ?

(2) From Wiki

The need arises where the language allows different entities to be named with the same identifier as long as they occupy a different namespace (where a namespace is typically defined by a module, class, or explicit namespace directive).

I don't quite understand why name mangling is only applied to the cases when the identifiers belong to different namespaces, since overloading functions can be in the same namespace and same-name global and local variables can also be in the same space. How to understand this?

Do variables with same name but in different scopes also use name mangling?

(3) Does C have name mangling? If it does not, how can it deal with the case when some global and local variables have the same name? C does not have overloading functions, right?

Thanks and regards!

like image 854
Tim Avatar asked May 30 '10 02:05

Tim


People also ask

Why name mangling is required?

Name mangling is the encoding of function and variable names into unique names so that linkers can separate common names in the language. Type names may also be mangled. Name mangling is commonly used to facilitate the overloading feature and visibility within different scopes.

Does C use name mangling?

Since C is a programming language that does not support name function overloading, it does no name mangling.

What is mean by name mangling naming decoration?

In compiler construction, name mangling (also called name decoration) is a technique used to solve various problems caused by the need to resolve unique names for programming entities in many modern programming languages.

What is extern and name mangling?

Name Mangling and extern “C” in C++Using this feature, we can create functions with same name. The only difference is the type of the arguments, and the number of arguments. The return type is not considered here.


1 Answers

C does not do name mangling, though it does pre-pend an underscore to function names, so the printf(3) is actually _printf in the libc object.

In C++ the story is different. The history of it is that originally Stroustrup created "C with classes" or cfront, a compiler that would translate early C++ to C. Then rest of the tools - C compiler and linker would we used to produce object code. This implied that C++ names had to be translated to C names somehow. This is exactly what name mangling does. It provides a unique name for each class member and global/namespace function and variable, so namespace and class names (for resolution) and argument types (for overloading) are somehow included in the final linker names.

This is very easy to see with tools like nm(1) - compile your C++ source and look at the generated symbols. The following is on OSX with GCC:

namespace zoom {     void boom( const std::string& s )     {         throw std::runtime_error( s );     } }  ~$ nm a.out | grep boom 0000000100001873 T __ZN4zoom4boomERKSs 

In both C and C++ local (automatic) variables produce no symbols, but live in registers or on stack.

Edit:

Local variables do not have names in resulting object file for mere reason that linker does not need to know about them. So no name, no mangling. Everything else (that linker has to look at) is name-mangled in C++.

like image 194
Nikolai Fetissov Avatar answered Sep 17 '22 22:09

Nikolai Fetissov