Difference between revisions of "Language Reference/Namespaces"
m (→Namespace qualification: wiki markup bug) |
m (header levels) |
||
Line 57: | Line 57: | ||
The full names are not always convenient and therefore it is possible to use shorter names in certain situations. | The full names are not always convenient and therefore it is possible to use shorter names in certain situations. | ||
=== Open namespaces === | ==== Open namespaces ==== | ||
First of all it is possible to <vp>open</vp> namespaces inside a scope: | First of all it is possible to <vp>open</vp> namespaces inside a scope: | ||
Line 70: | Line 70: | ||
The namespace that a certain scope (i.e. interface/class/implementation) belongs to is (implicitly) open inside that scope. | The namespace that a certain scope (i.e. interface/class/implementation) belongs to is (implicitly) open inside that scope. | ||
=== Namespace qualification === | ==== Namespace qualification ==== | ||
Since several namespaces be open simultaneously it is possible that names may clash. Using the full name it is always possible to resolve any ambiguity. | Since several namespaces be open simultaneously it is possible that names may clash. Using the full name it is always possible to resolve any ambiguity. |
Revision as of 15:03, 16 October 2008
Namespaces can be used to avoid name clashes, without having to use long strange names. The names in two different namespaces will never clash, but it may be necessary to qualify references with the namespace (or part of it) to resolve ambiguities.
A namespaces are declared and defined implicitly using NamespaceEntrance'es:
NamespaceEntrance: namespace NamespaceIdentifier
NamespaceIdentifier: one of LowercaseIdentifier LowercaseIdentifier \ NamespaceIdentifier
In short a NamespaceIdentifier is a sequence of lowercase identifiers separated by backslashes.
Namespace Entrances and Regions
Namespace entrances divide source files into namespace regions.
A namespace entrance marks the beginning of a namespace region, which ends ends at the next namespace entrance or the end of the file.
Every file starts in the root namespace.
Namespace regions are not influenced by #include directives, meaning:
- Namespace entrances in an #include-file does not change the namespace region in the including file
- Any file starts in the root namespace (also if it is included inside a namespace region in another file).
Any interface, class and implementation that is meet inside a namespace region belongs to that namespace.
Example
class aaa end class aaa namespace xxx class bbb end class bbb namespace xxx\yyy class ccc end class ccc
This file is divided in three regions (assuming that it is a complete file). The first region is in the root namespace (\), the second region belongs to the xxx namespace and the third region belongs to the xxx\yyy namespace.
Subsequently, the class aaa belongs to the root namespace, the class bbb belongs to the namespace xxx and finally the class ccc belongs to the namespace xxx\yyy.
Referencing names in namespaces
If ccc is a class in the namespace xxx\yyy, then the full name of ccc is \xxx\yyy\ccc.
The leading backslash indicates that we start from the root namespace.
A class/interface can always be uniqly referenced using its full name.
The full names are not always convenient and therefore it is possible to use shorter names in certain situations.
Open namespaces
First of all it is possible to open namespaces inside a scope:
class aaa open xxx\yyy\ ... end class aaa
Opening a namespace is distinguished from opening a class/interface by the trailing backslash.
The namespace that a certain scope (i.e. interface/class/implementation) belongs to is (implicitly) open inside that scope.
Namespace qualification
Since several namespaces be open simultaneously it is possible that names may clash. Using the full name it is always possible to resolve any ambiguity.
But it is also possible to use suffix qualification. With suffix qualification you write a suffix of the namespace. A suffix goes from right after a backslash to the end of the namespace identifier.
Example The suffixes of \xxx\yyy\zzz are:
xxx\yyy\zzz yyy\zzz zzz
So if aaa is a class in \xxx\yyy\zzz, these are the possible suffix qualifications:
xxx\yyy\zzz::aaa yyy\zzz::aaa zzz::aaa