开发者

Is it wrong to use C++ 'using' keyword in a header file?

I've been told it's bad to have "using namespace ns123" in a header file, but I can't remember what开发者_开发知识库 the reason given was. Is it in fact a bad thing to do, and why?


It's a bad practice, in general, because it defeats the purpose of namespaces. By defining in a header you're not enforcing strict control over the scope of the using declaration, meaning that you can run into name clashes in unexpected places.


If you put a using declaration in a header file, anything that #includes the header file also has the namespace imported, whether they want it or not. This violates the principle of least surprise and defeats the purpose of namespaces by allowing changing an #include statement to easily cause a naming collision. If you want to import a namespace in your own .cpp file to save a little typing and produce more readable code, that's fine. Just don't force users of your module to do the same.


Pulling all the classes and functions out of their namespace is generally a bad idea and is actually opposed to concept of having namespaces...it is usually better to use 'using' on a specific class or function.


It will often give you strange and mysterious compilation errors, for one thing, where you can spend hours trying to figure out the root of the problem.


Ordinary C++ Programming

Yes there are often places where this makes sense, and you have control over where and how you use your using stamenets. If this is a program with a limited scope you do not need to worry about place usings in global scope.

For monolithic applications I would strongly recommend not placing usings in a very busy namespace -- as collisions will drive you mad once you are committed. For example:

  1. ::
  2. ::companyname
  3. ::companyname::component
  4. ::companyname::component::sub-component.

I would say that it is perfectly acceptable to start place using statements at level 3 or 4 -- thats where the chances of collisions start becoming very low.

Generic / TMP Programming

In generic programming and TMP using is often used to configure your libraries for a specific domain and this is often done through using statements.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜