1 <?xml version=
"1.0" encoding=
"UTF-8" standalone=
"no"?>
2 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 <html xmlns=
"http://www.w3.org/1999/xhtml"><head><meta http-equiv=
"Content-Type" content=
"text/html; charset=UTF-8" /><title>Namespaces
</title><meta name=
"generator" content=
"DocBook XSL Stylesheets V1.73.2" /><meta name=
"keywords" content=
" ISO C++ , library " /><link rel=
"start" href=
"../spine.html" title=
"The GNU C++ Library Documentation" /><link rel=
"up" href=
"using.html" title=
"Chapter 3. Using" /><link rel=
"prev" href=
"bk01pt01ch03s02.html" title=
"Headers" /><link rel=
"next" href=
"bk01pt01ch03s04.html" title=
"Macros" /></head><body><div class=
"navheader"><table width=
"100%" summary=
"Navigation header"><tr><th colspan=
"3" align=
"center">Namespaces
</th></tr><tr><td width=
"20%" align=
"left"><a accesskey=
"p" href=
"bk01pt01ch03s02.html">Prev
</a> </td><th width=
"60%" align=
"center">Chapter
3. Using
</th><td width=
"20%" align=
"right"> <a accesskey=
"n" href=
"bk01pt01ch03s04.html">Next
</a></td></tr></table><hr /></div><div class=
"sect1" lang=
"en" xml:
lang=
"en"><div class=
"titlepage"><div><div><h2 class=
"title" style=
"clear: both"><a id=
"manual.intro.using.namespaces"></a>Namespaces
</h2></div></div></div><div class=
"sect2" lang=
"en" xml:
lang=
"en"><div class=
"titlepage"><div><div><h3 class=
"title"><a id=
"manual.intro.using.namespaces.all"></a>Available Namespaces
</h3></div></div></div><p> There are three main namespaces.
4 </p><div class=
"itemizedlist"><ul type=
"disc"><li><p>std
</p><p>The ISO C++ standards specify that
"all library entities are defined
5 within namespace std." This includes namepaces nested
6 within
<code class=
"code">namespace std
</code>, such as
<code class=
"code">namespace
8 </p></li><li><p>abi
</p><p>Specified by the C++ ABI. This ABI specifies a number of type and
9 function APIs supplemental to those required by the ISO C++ Standard,
10 but necessary for interoperability.
11 </p></li><li><p>__gnu_
</p><p>Indicating one of several GNU extensions. Choices
12 include
<code class=
"code">__gnu_cxx
</code>,
<code class=
"code">__gnu_debug
</code>,
<code class=
"code">__gnu_parallel
</code>,
13 and
<code class=
"code">__gnu_pbds
</code>.
14 </p></li></ul></div><p> A complete list of implementation namespaces (including namespace contents) is available in the generated source
<a class=
"ulink" href=
"http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaces.html" target=
"_top">documentation
</a>.
15 </p></div><div class=
"sect2" lang=
"en" xml:
lang=
"en"><div class=
"titlepage"><div><div><h3 class=
"title"><a id=
"manual.intro.using.namespaces.std"></a>namespace std
</h3></div></div></div><p>
16 One standard requirement is that the library components are defined
17 in
<code class=
"code">namespace std::
</code>. Thus, in order to use these types or
18 functions, one must do one of two things:
19 </p><div class=
"itemizedlist"><ul type=
"disc"><li><p>put a kind of
<span class=
"emphasis"><em>using-declaration
</em></span> in your source
20 (either
<code class=
"code">using namespace std;
</code> or i.e.
<code class=
"code">using
21 std::string;
</code>) This approach works well for individual source files, but
22 should not be used in a global context, like header files.
23 </p></li><li><p>use a
<span class=
"emphasis"><em>fully
24 qualified name
</em></span>for each library symbol
25 (i.e.
<code class=
"code">std::string
</code>,
<code class=
"code">std::cout
</code>) Always can be
26 used, and usually enhanced, by strategic use of typedefs. (In the
27 cases where the qualified verbiage becomes unwieldy.)
28 </p></li></ul></div></div><div class=
"sect2" lang=
"en" xml:
lang=
"en"><div class=
"titlepage"><div><div><h3 class=
"title"><a id=
"manual.intro.using.namespaces.comp"></a>Using Namespace Composition
</h3></div></div></div><p>
29 Best practice in programming suggests sequestering new data or
30 functionality in a sanely-named, unique namespace whenever
31 possible. This is considered an advantage over dumping everything in
32 the global namespace, as then name look-up can be explicitly enabled or
33 disabled as above, symbols are consistently mangled without repetitive
34 naming prefixes or macros, etc.
35 </p><p>For instance, consider a project that defines most of its classes in
<code class=
"code">namespace gtk
</code>. It is possible to
36 adapt
<code class=
"code">namespace gtk
</code> to
<code class=
"code">namespace std
</code> by using a C++-feature called
37 <span class=
"emphasis"><em>namespace composition
</em></span>. This is what happens if
38 a
<span class=
"emphasis"><em>using
</em></span>-declaration is put into a
39 namespace-definition: the imported symbol(s) gets imported into the
40 currently active namespace(s). For example:
41 </p><pre class=
"programlisting">
45 using std::tr1::array;
50 In this example,
<code class=
"code">std::string
</code> gets imported into
51 <code class=
"code">namespace gtk
</code>. The result is that use of
52 <code class=
"code">std::string
</code> inside namespace gtk can just use
<code class=
"code">string
</code>, without the explicit qualification.
54 <code class=
"code">std::string
</code> does not get imported into
55 the global namespace. Additionally, a more elaborate arrangement can be made for backwards compatibility and portability, whereby the
56 <code class=
"code">using
</code>-declarations can wrapped in macros that
57 are set based on autoconf-tests to either
"" or i.e.
<code class=
"code">using
58 std::string;
</code> (depending on whether the system has
59 libstdc++ in
<code class=
"code">std::
</code> or not). (ideas from
60 <code class=
"email"><<a class=
"email" href=
"mailto:llewelly@dbritsch.dsl.xmission.com">llewelly@dbritsch.dsl.xmission.com
</a>></code>, Karl Nelson
<code class=
"email"><<a class=
"email" href=
"mailto:kenelson@ece.ucdavis.edu">kenelson@ece.ucdavis.edu
</a>></code>)
61 </p></div></div><div class=
"navfooter"><hr /><table width=
"100%" summary=
"Navigation footer"><tr><td width=
"40%" align=
"left"><a accesskey=
"p" href=
"bk01pt01ch03s02.html">Prev
</a> </td><td width=
"20%" align=
"center"><a accesskey=
"u" href=
"using.html">Up
</a></td><td width=
"40%" align=
"right"> <a accesskey=
"n" href=
"bk01pt01ch03s04.html">Next
</a></td></tr><tr><td width=
"40%" align=
"left" valign=
"top">Headers
</td><td width=
"20%" align=
"center"><a accesskey=
"h" href=
"../spine.html">Home
</a></td><td width=
"40%" align=
"right" valign=
"top"> Macros
</td></tr></table></div></body></html>