I just joined a new C++ software project and I’m trying to understand the design. The project makes frequent use of unnamed namespaces. For example, something like this may occur in a class definition file:
// newusertype.cc namespace { const int SIZE_OF_ARRAY_X; const int SIZE_OF_ARRAY_Y; bool getState(userType*,otherUserType*); } newusertype::newusertype(...) {...
What are the design considerations that might cause one to use an unnamed namespace? What are the advantages and disadvantages?
Unnamed namespaces are a utility to make an identifier translation unit local. They behave as if you would choose a unique name per translation unit for a namespace:
The extra step using the empty body is important, so you can already refer within the namespace body to identifiers like
::namethat are defined in that namespace, since the using directive already took place.This means you can have free functions called (for example)
helpthat can exist in multiple translation units, and they won’t clash at link time. The effect is almost identical to using thestatickeyword used in C which you can put in in the declaration of identifiers. Unnamed namespaces are a superior alternative, being able to even make a type translation unit local.Both
a‘s are translation unit local and won’t clash at link time. But the difference is that thea1in the anonymous namespace gets a unique name.Read the excellent article at comeau-computing Why is an unnamed namespace used instead of static? (Archive.org mirror).