Re: namespaces, class libraries, and VERY large projects
apm35@student.open.ac.uk wrote:
I have a question about the way people choose to partition large C++
projects (millions of LOC, lots of class libraries) using namespaces.
I have seen three ways of doing it which will be discussed below: As an
example, suppose we have libraries A, B, C and D. Suppose A is the
foundation library, B and C use it, and D uses B and C and also makes
direct calls to stuff in A.
1. Give each class library its own namespace, qualify all usage.
Consider code in C. It will have to qualify stuff coming
from A and B. Similarly, in D, the code will have to
qualify stuff coming from A, B and C.
2. Give each class library its own namespace,
employ "using namespace" for all used namespaces
at the start of each ".cpp" file. For source in D this
will often mean saying:
using namespace A;
using namespace B;
using namespace C;
at the start of each ".cpp".
3. Employ nested namespaces.
A is the outermost, then B, then C (even though they
are peers), then D. No qualifications are needed
anywhere, neither are using directives.
I use fewer namespaces than you then because I do not even give every
library its own namespace. Every project has its own namespace, but a
project can contain many libraries. Projects are considered separate
entities that may share some common code.
There is usually an umbrella system whereby the top-level namespace
(immediately under the global one) contains all the most generic code,
then each project underneath defines in its own space under there.
Therefore at most you qualify with 2 namespace, eg if A is the top
level namespace and B is the project level then A::B.
At project level, one may define sub-namespaces for internal use, i.e.
"private" namespaces, in order that you can define your own terms in
there that nobody else will be using and avoiding nameclashes when you
do so.
I am assuming here that at project level one will be careful enough to
avoid clashes because everyone knows what others are doing in the
public interface. It is actually disciplined to put anything extra into
a "private" namespace eg pImpl classes.
Using directives are never used in headers. In source files they may be
used as ambiguities can easily be resolved.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]