C++: Should I use 'typedef' or 'using namespace'? [closed]
-
03-06-2021 - |
Question
I am writing a library with mutiple dependent modules. When I include a file from a different module, should I resolve the namespace with:
using namespace project1::namespace1;
class1 obj;
or
typedef project1::namespace1::class1 class1;
class1 obj;
What are the pros/cons of each approach? I read somewhere that we should use typedef
in .H files and using
in .C files, is this advisable?
One problem I have encountered with 'typedef' is it leads to namespace ambiguity if I include both original class and the class with 'typedef' in a third module.
Solution
The two options you state are not equivalent. This one:
using namespace project1::namespace1;
pulls in everything from the namespace, giving you little control and making clashes likely. I see only cons, and no pros here.
But you don't need to use a typedef
to bring in a single symbol, you can use
using project1::namespace1::class1;
Whether you use this or the typedef
doesn't make too much of a difference. But bear in mind that typedef
is limited to types and enumerations, whereas using
can refer to values, functions, etc:
namespace X {
const int x{42};
enum Fruit{Apple, Pear};
}
using X::x; // OK
typedef X::x xx; // Error! 'x' in namespace 'X' does not name a type
so the two expressions are not completely equivalent.
OTHER TIPS
You should never use using
or typedef
in a header file just for the sake of making names easier to type.
In the source file, it's up to you. It seems to be considered good practice to write out the whole name, as it makes it very clear what you meant. If your namespace is too long, you can use a namespace alias to reduce clutter, but still keep the meaning clear: namespace ns = project1::namespace1;
Either way, if you're going to import symbols into the global namespace, use using
, not typedef
. typedef
is used mainly when you want to call the type by a different name, many times because it is a template - for example, my_map
instead of std::map<std::string, my_type>
, which is still clear, but much nicer to type.
Also, see this question: Why is "using namespace std" considered bad practice?
The most clear way is not use any of those methods - just write new project1::namespace1::class1()
.
use using project1::namespace1::class1
Or, you can limit your using namespce in a local scope, both for your convenience and not polute the global namespace.
void function()
{
using namespace project1::namespace1;
class1 obj;
...
}