namespace N { | // An extension of the first part of | namespace N | |
char const* f(int); // Leave the implementation to another | |||
} | // translation | unit. |
|
int main() { |
|
|
|
printf(“Calling: %s.\n”, N::f()); | // OK, declared and defined above | ||
printf(“Calling: %s.\n”, N::f(7)); | // OK, declared above (defined elsewhere) | ||
printf(“Calling: %s.\n”, f(3.0)); | // OK, declared above (defined below) | ||
return 0; |
|
|
|
} |
|
|
|
namespace { // An extension of the unnamed namespace in this translation unit char const* f(double) { return “f(double) in main() translation unit”; }
}
An Auxiliary Translation Unit
Following is an auxiliary translation unit that illustrates how namespaces interact across translation units.
namespace { // An unnamed namespace unrelated to the // one in the other translation units.
char const* f(double) { return “f(double) in auxiliary translation unit”; }
}
namespace N { // This namespace is the same as the
//one in the main() translation unit.
//We implement f(int) here.
char const* f(int) { return “f(int) defined in auxiliary translation unit”; }
}
using- declarations and using- directives
C++ provides two alternatives to explicitly qualifying names in namespaces. These are the using- declaration and the using- directive.
using- declaration
A using- declaration introduces a declaration in the current scope as follows:
using N::x; // Where N is a namespace, x is a name in N
After this declaration, all uses of x in this scope are taken to defer to N::x. (The N:: prefix is no longer required.)
If another declaration of x were introduced in the same scope, for example:
int x;
then a compiler error occurs.
using- directive
The using- directive directs the lookup for names not declared in current scope, for example:
using namespace N; // If not found, lookup names in namespace N
If x is a name in namespace N, but another declaration of x is present in the current scope, for example:
int x;
a compiler error is not necessarily emitted. Only if that name is used will an ambiguity occur.
NOTE: Using- directives are transitive. If you specify a using- directiveto one namespace which itself specifies a directive to another namespace, then names used in your scope will also be looked up in that other namespace.
HP aC++ Keywords 145