Speaking of headers, did you ever think about what you are really doing when you put using namespace my_util
in a header file? Sure, it might be annoying to namespace-qualify all the types in your declarations. But using namespace my_util
forces all the names in my_util
into the global namespace of everyone who includes your header file.
As usual, here is a small example:
my_iface.hxx
:
bool check(my_types::Foo foo, my_types::Bar bar); bool listen(my_types::Foo foo, my_types::Bar bar); bool digest(my_types::Foo foo, my_types::Bar bar);
The repeated namespace qualifying gets annoying, so you would rather do:
my_iface.hxx
:
using namespace my_types; bool check(Foo foo, Bar bar); bool listen(Foo foo, Bar bar); bool digest(Foo foo, Bar bar);
This is however a bad idea. “using namespace my_types
” (a using directive) exports all the types in my_types
into the global namespace, which I think everyone agrees is a bad idea. You could argue that a using declaration is better, as “using my_types::Foo
” only places Foo
into the global namespace. I would however disagree, as a smaller sin is still a sin.
And you’re not getting away that easily, this argument is also valid for std
! Yes, you need to type my_func(std::vector v)
in header files.
A final trick you might try is to only use using namespace
inside of your other namespaces, like so:
my_iface.hxx
:
namespace my_iface { using namespace my_types; bool check(Foo foo, Bar bar); bool listen(Foo foo, Bar bar); bool digest(Foo foo, Bar bar); }
This is still a bad idea. You are not polluting the global namespace any more, but you are polluting your own. There are at least two problems with this approach: First, someone who uses your libraries might now accidentally qualify Foo
as my_iface::Foo
. If you ever decide to clean up my_iface
and remove the using directive, that poor guys code is going to break. Also, if this guy decides he wants to have using namespace my_iface
somewhere in his code, he probably doesn’t want all your other namespaces (and std, boost or whatever) included as well.
As usual, normal politeness applies: A one-time annoyance for you is better than a repeated annoyance for all your users.