Click here to Skip to main content
Click here to Skip to main content

Using namespaces properly

By , 30 Jan 2001
 

Introduction

Namespaces are a very powerful C++ language feature. This article does not teach you the syntax of namespaces. Rather, it shows you how to use them properly.

Namespaces simply wrap all enclosed names with another name. For example:

namespace net {
    class Socket {
        ...
    };
}

...

net::Socket socket;

By doing that, they make sure that if two libraries both implement the Socket class, if they name their namespaces differently your program can use both without a conflict.

But this brings up another question: If two independent companies both decide to write network libraries, what are the chances that they are going to implement a class named Socket? My guess is somewhere around 100 percent.

We also like it when namespace names are easy to type, which means that they should be 2-4 characters long. With that in mind, what are the chances that both companies are going to name their namespace net? 5 percent? 10 percent?

Whatever it is, it shows that namespaces do not solve the problem, they only make it less severe.

An Industrial Strength Solution

The solution to this problem is to use long, unique namespace names, and then bring the namespaces into a program by using short aliases.

So a company writing the network library should write something like:

namespace net_33843894 {
    class Socket {
        ...
    };
}

where the number after net_ is going to be generated using a random number generator. Say this code is placed in a header file called <netlib>

Then the library is sold to a client, who decides to use it on a project. The client then writes his own project-local header file named <mynetlib>, with the following content:

#include <netlib>

namespace net = net_33843894;

He has just created a project-local alias for the namespace of his library vendor. If the namespace name net had already been taken by another library, the user can choose another name: net2, sock, or something else. There will be no name conflicts.

Lowering Barriers

A smart thing to do with your library is to make it easy for people to start using it. In an ideal world, they should be able to double-click on an installation file and the library would be immediately available inside their development environment. Next thing they are typing is #include <yourlib> and they are using it to do something useful.

However, if the user has to make his own header for every header in your library, then he has to suffer a little bit in order to use it. Not every user will be willing to do so.

The solution to this problem is to provide reasonable defaults, but to let the users cop out of them if they are not suitable. The way to do this is with preprocessor directives in your header file:

namespace net_33843894 {
    class Socket {
        ...
    };
}

#ifndef NO_NET_33843894_ALIAS
    namespace net = net_33843894;
#endif

This way, we provide a reasonable default for the namespace name. If that name is already taken, then the user can define the macro NO_NET_33843894_ALIAS and no alias will be defined.

Current Compilers

Error messages are already a nightmare with templates. With long namespace names, we make them even worse.

Unfortunately, none of the compilers I use are smart enough to display an error with the shortest available namespace alias at the point of error. So even though you may be using the alias net, if you make an error using the Socket class the error will mention net_33843894::Socket. Not very readable.

So I use a little trick. It works only for headers that contain only inline functions (as it affects the actual names used by the linker), but I have plenty of those. If the macro NO_NET_33843894_ALIAS is not defined, I use the short name as the namespace name, and the long name as the alias:

#ifdef NO_NET_33843894_ALIAS
namespace net_33843894 {
#else
namespace net {
#endif
    class Socket {
        ...
    };
}

#ifndef NO_NET_33843894_ALIAS
    namespace net_33843894 = net;
#endif

And the error messages become bearable again.

 

For more good stuff about C++, including a way to write code without memory errors, visit http://www.jelovic.com.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Dejan Jelovic
Yugoslavia Yugoslavia
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralNO!! Don't do this! Just use nested namespaces.memberDon Clugston29 Mar '04 - 12:50 
GeneralRe: NO!! Don't do this! Just use nested namespaces.memberAndreRyan29 Feb '08 - 17:03 
GeneralRe: NO!! Don't do this! Just use nested namespaces.memberMember 368078527 Jan '09 - 11:08 
GeneralGreat article for newbies - idea for extension...memberPaul Evans12 Dec '02 - 10:35 
GeneralA better solution to your problemmemberJakesf2217 May '01 - 14:05 
GeneralRe: A better solution to your problemmemberDejan Jelovic18 May '01 - 2:21 
GeneralHELP ME PLS!!!!!!!!!!!!!!!memberalharthi7 May '01 - 6:01 
GeneralRe: HELP ME PLS!!!!!!!!!!!!!!!memberAnonymous7 May '01 - 6:45 
GeneralRe: HELP ME PLS!!!!!!!!!!!!!!!memberekolis8 Jul '12 - 13:03 
GeneralHELP ME PLS!!!!!!!!!!!!!!!memberalharthi7 May '01 - 6:01 
GeneralRe: HELP ME PLS!!!!!!!!!!!!!!!memberAfterEleven1 Jun '01 - 9:47 
GeneralAn alternative to a random numbermemberJason De Arte31 Jan '01 - 8:53 
GeneralRe: An alternative to a random number -- not reallymemberDejan Jelovic31 Jan '01 - 10:37 
GeneralSuggestion: URNs as namespace identifiersmemberJonathan Gilligan31 Jan '01 - 13:30 
GeneralRe: Suggestion: URNs as namespace identifiersmemberDejan Jelovic18 May '01 - 2:31 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 31 Jan 2001
Article Copyright 2001 by Dejan Jelovic
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid