summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3/doc/html/18_support/howto.html
diff options
context:
space:
mode:
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>2008-01-18 08:16:51 +0000
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>2008-01-18 08:16:51 +0000
commit0aeadebf36eab6d537b67b38c5dcacf648f2f69f (patch)
tree0fd3dc60ac26e2ec9502783b72d38867bcb418d8 /libstdc++-v3/doc/html/18_support/howto.html
parent9e61be0719e3f9d3bda483eaaf71ee67f02e81ae (diff)
downloadppe42-gcc-0aeadebf36eab6d537b67b38c5dcacf648f2f69f.tar.gz
ppe42-gcc-0aeadebf36eab6d537b67b38c5dcacf648f2f69f.zip
2008-01-18 Benjamin Kosnik <bkoz@redhat.com>
* docs/*: To... * doc/*: ...here. * testsuite/Makefile.am: Move doc-performance to... * Makefile.am: Add doc to SUBDIRS, move doxygen-* rules to... * doc/Makefile.am: Consolidate documentation creation here. (doc-doxygen-html): New. (doc-doxygen-man): New. (doc-performance): New. * doc/Makefile.in: New. * acinclude.m4 (glibcxx_SUBDIRS): Add doc directory. * doc/doxygen/guide.html: Edit for unified html configuration. * doc/doxygen/mainpage.html: Same. * doc/doxygen/run_doxygen: Same, more namespace fixups for man generation. * doc/doxygen/user.cfg.in: Update for doxygen 1.5.4. * include/tr1_impl/random: Remove maint from doxygen markup. * include/tr1_impl/functional: Same. * include/std/tuple: Same. * include/std/streambuf: Same. * include/std/bitset: Same. * include/std/limits: Same. * include/std/fstream: Same. * include/std/istream: Same. * include/std/sstream: Same. * include/ext/pool_allocator.h: Same. * include/ext/rc_string_base.h: Same. * include/bits/basic_ios.h: Same. * include/bits/stl_list.h: Same. * include/bits/stl_map.h: Same. * include/bits/locale_classes.h: Same. * include/bits/stl_set.h: Same. * include/bits/stl_iterator_base_types.h: Same. * include/bits/basic_string.h: Same. * include/bits/stl_multimap.h: Same. * include/bits/stl_vector.h: Same. * include/bits/ios_base.h: Same. * include/bits/stl_deque.h: Same. * include/bits/postypes.h: Same. * include/bits/stl_multiset.h: Same. * include/bits/stl_algo.h: Same. * include/bits/stl_iterator.h: Same. * include/bits/stl_tempbuf.h: Same. * include/bits/stl_construct.h: Same. * include/bits/stl_relops.h: Same. * include/tr1/tuple: Same. * include/backward/auto_ptr.h: Same. * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Fixups for line number changes. * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Same. * testsuite/23_containers/vector/requirements/dr438/ constructor_1_neg.cc: Same. * testsuite/23_containers/vector/requirements/dr438/ constructor_2_neg.cc: Same. * testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Same. * testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Same. * testsuite/23_containers/deque/requirements/dr438/ constructor_1_neg.cc: Same. * testsuite/23_containers/deque/requirements/dr438/ constructor_2_neg.cc: Same. * testsuite/23_containers/list/requirements/dr438/assign_neg.cc: Same. * testsuite/23_containers/list/requirements/dr438/insert_neg.cc: Same. * testsuite/23_containers/list/requirements/dr438/ constructor_1_neg.cc: Same. * testsuite/23_containers/list/requirements/dr438/ constructor_2_neg.cc: Same. * testsuite/20_util/auto_ptr/assign_neg.cc: Same. * aclocal.m4: Regenerate. * config.h.in: Regenerate. * configure: Regenerate. * Makefile.in: Regenerate. * src/Makefile.in: Regenerate. * po/Makefile.in: Regenerate. * libmath/Makefile.in: Regenerate. * include/Makefile.in: Regenerate. * libsupc++/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. * scripts/make_graphs.py: Correct paths for new layout. 2008-01-17 Benjamin Kosnik <bkoz@redhat.com> * acinclude.m4 (AC_LC_MESSAGES): Remove serial. * linkage.m4 (AC_REPLACE_MATHFUNCS): Same. * configure: Regenerate. * aclocal.m4: Regenerate. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131625 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/doc/html/18_support/howto.html')
-rw-r--r--libstdc++-v3/doc/html/18_support/howto.html435
1 files changed, 435 insertions, 0 deletions
diff --git a/libstdc++-v3/doc/html/18_support/howto.html b/libstdc++-v3/doc/html/18_support/howto.html
new file mode 100644
index 00000000000..d7ea434db2d
--- /dev/null
+++ b/libstdc++-v3/doc/html/18_support/howto.html
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <meta name="AUTHOR" content="pme@gcc.gnu.org (Phil Edwards)" />
+ <meta name="KEYWORDS" content="HOWTO, libstdc++, GCC, g++, libg++, STL" />
+ <meta name="DESCRIPTION" content="HOWTO for the libstdc++ chapter 18." />
+ <meta name="GENERATOR" content="vi and eight fingers" />
+ <title>libstdc++ HOWTO: Chapter 18: Library Support</title>
+<link rel="StyleSheet" href="../lib3styles.css" type="text/css" />
+<link rel="Start" href="../documentation.html" type="text/html"
+ title="GNU C++ Standard Library" />
+<link rel="Prev" href="../17_intro/howto.html" type="text/html"
+ title="Library Introduction" />
+<link rel="Next" href="../19_diagnostics/howto.html" type="text/html"
+ title="Diagnostics" />
+<link rel="Copyright" href="../17_intro/license.html" type="text/html" />
+<link rel="Help" href="../faq/index.html" type="text/html" title="F.A.Q." />
+</head>
+<body>
+
+<h1 class="centered"><a name="top">Chapter 18: Library Support</a></h1>
+
+<p>Chapter 18 deals with the functions called and objects created
+ automatically during the course of a program's existence.
+</p>
+<p>While we can't reproduce the contents of the Standard here (you need to
+ get your own copy from your nation's member body; see our homepage for
+ help), we can mention a couple of changes in what kind of support a C++
+ program gets from the Standard Library.
+</p>
+
+
+<!-- ####################################################### -->
+<hr />
+<h1>Contents</h1>
+<ul>
+ <li><a href="#1">Types</a></li>
+ <li><a href="#2">Implementation properties</a></li>
+ <li><a href="#3">Start and Termination</a></li>
+ <li><a href="#4">Verbose <code>terminate</code></a></li>
+ <li><a href="#5">Dynamic memory management</a></li>
+ <li><a href="#6">RTTI, the ABI, and demangling</a></li>
+</ul>
+
+<hr />
+
+<!-- ####################################################### -->
+
+<h2><a name="1">Types</a></h2>
+ <p>All the types that you're used to in C are here in one form or
+ another. The only change that might affect people is the type of
+ NULL: while it is required to be a macro, the definition of that
+ macro is <em>not</em> allowed to be <code>(void*)0</code>, which is
+ often used in C.
+ </p>
+ <p>In g++, NULL is #define'd to be <code>__null</code>, a magic keyword
+ extension of g++.
+ </p>
+ <p>The biggest problem of #defining NULL to be something like
+ &quot;0L&quot; is that the compiler will view that as a long integer
+ before it views it as a pointer, so overloading won't do what you
+ expect. (This is why g++ has a magic extension, so that NULL is
+ always a pointer.)
+ </p>
+ <p>In his book
+ <a href="http://www.awprofessional.com/titles/0-201-92488-9/"><em>Effective C++</em></a>,
+ Scott Meyers points out that the best way to solve this problem is to
+ not overload on pointer-vs-integer types to begin with. He also
+ offers a way to make your own magic NULL that will match pointers
+ before it matches integers:
+ </p>
+ <pre>
+ const // this is a const object...
+ class {
+ public:
+ template&lt;class T&gt; // convertible to any type
+ operator T*() const // of null non-member
+ { return 0; } // pointer...
+
+ template&lt;class C, class T&gt; // or any type of null
+ operator T C::*() const // member pointer...
+ { return 0; }
+
+ private:
+ void operator&amp;() const; // whose address can't be
+ // taken (see Item 27)...
+
+ } NULL; // and whose name is NULL
+ </pre>
+ <p>(Cribbed from the published version of
+ <a href="http://www.awprofessional.com/titles/0-201-31015-5/">the
+ Effective C++ CD</a>, reproduced here with permission.)
+ </p>
+ <p>If you aren't using g++ (why?), but you do have a compiler which
+ supports member function templates, then you can use this definition
+ of NULL (be sure to #undef any existing versions). It only helps if
+ you actually use NULL in function calls, though; if you make a call of
+ <code>foo(0);</code> instead of <code>foo(NULL);</code>, then you're back
+ where you started.
+ </p>
+ <p><strong>Added Note:</strong> When we contacted Dr. Meyers to ask
+ permission to
+ print this stuff, it prompted him to run this code through current
+ compilers to see what the state of the art is with respect to member
+ template functions. He posted
+ <a href="http://groups.google.com/groups?oi=djq&amp;selm=an_644660779">
+ an article to Usenet</a> after discovering that the code above is not
+ valid! Even though it has no data members, it still needs a
+ user-defined constructor (which means that the class needs a type name
+ after all). The ctor can have an empty body; it just needs to be
+ there. (Stupid requirement? We think so too, and this will probably
+ be changed in the language itself.)
+ </p>
+ <p>Return <a href="#top">to top of page</a> or
+ <a href="../faq/index.html">to the FAQ</a>.
+ </p>
+
+<hr />
+<h2><a name="2">Implementation properties</a></h2>
+ <h3><code>&lt;limits&gt;</code></h3>
+ <p>This header mainly defines traits classes to give access to various
+ implementation defined-aspects of the fundamental types. The
+ traits classes -- fourteen in total -- are all specializations of the
+ template class <code>numeric_limits</code>, documented
+ <a href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/structstd_1_1numeric__limits.html">here</a>
+ and defined as follows:
+ </p>
+ <pre>
+ template&lt;typename T&gt; struct class {
+ static const bool is_specialized;
+ static T max() throw();
+ static T min() throw();
+
+ static const int digits;
+ static const int digits10;
+ static const bool is_signed;
+ static const bool is_integer;
+ static const bool is_exact;
+ static const int radix;
+ static T epsilon() throw();
+ static T round_error() throw();
+
+ static const int min_exponent;
+ static const int min_exponent10;
+ static const int max_exponent;
+ static const int max_exponent10;
+
+ static const bool has_infinity;
+ static const bool has_quiet_NaN;
+ static const bool has_signaling_NaN;
+ static const float_denorm_style has_denorm;
+ static const bool has_denorm_loss;
+ static T infinity() throw();
+ static T quiet_NaN() throw();
+ static T denorm_min() throw();
+
+ static const bool is_iec559;
+ static const bool is_bounded;
+ static const bool is_modulo;
+
+ static const bool traps;
+ static const bool tinyness_before;
+ static const float_round_style round_style;
+ };</pre>
+ <p>Return <a href="#top">to top of page</a> or
+ <a href="../faq/index.html">to the FAQ</a>.
+ </p>
+
+<hr />
+<h2><a name="3">Start and Termination</a></h2>
+ <p>Not many changes here to <code>&lt;cstdlib&gt;</code> (the old stdlib.h).
+ You should note that the <code>abort()</code> function does not call
+ the destructors of automatic nor static objects, so if you're depending
+ on those to do cleanup, it isn't going to happen. (The functions
+ registered with <code>atexit()</code> don't get called either, so you
+ can forget about that possibility, too.)
+ </p>
+ <p>The good old <code>exit()</code> function can be a bit funky, too, until
+ you look closer. Basically, three points to remember are:
+ </p>
+ <ol>
+ <li>Static objects are destroyed in reverse order of their creation.
+ </li>
+ <li>Functions registered with <code>atexit()</code> are called in
+ reverse order of registration, once per registration call.
+ (This isn't actually new.)
+ </li>
+ <li>The previous two actions are &quot;interleaved,&quot; that is,
+ given this pseudocode:
+ <pre>
+ extern "C or C++" void f1 (void);
+ extern "C or C++" void f2 (void);
+
+ static Thing obj1;
+ atexit(f1);
+ static Thing obj2;
+ atexit(f2);
+ </pre>
+ then at a call of <code>exit()</code>, f2 will be called, then
+ obj2 will be destroyed, then f1 will be called, and finally obj1
+ will be destroyed. If f1 or f2 allow an exception to propagate
+ out of them, Bad Things happen.
+ </li>
+ </ol>
+ <p>Note also that <code>atexit()</code> is only required to store 32
+ functions, and the compiler/library might already be using some of
+ those slots. If you think you may run out, we recommend using
+ the xatexit/xexit combination from libiberty, which has no such limit.
+ </p>
+ <p>Return <a href="#top">to top of page</a> or
+ <a href="../faq/index.html">to the FAQ</a>.
+ </p>
+
+<hr />
+<h2><a name="4">Verbose <code>terminate</code></a></h2>
+ <p>If you are having difficulty with uncaught exceptions and want a
+ little bit of help debugging the causes of the core dumps, you can
+ make use of a GNU extension in GCC 3.1 and later:
+ </p>
+ <pre>
+ #include &lt;exception&gt;
+
+ int main()
+ {
+ std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
+ ...
+
+ throw <em>anything</em>;
+ }</pre>
+ <p>The <code> __verbose_terminate_handler </code> function obtains the name
+ of the current exception, attempts to demangle it, and prints it to
+ stderr. If the exception is derived from <code> std::exception </code>
+ then the output from <code>what()</code> will be included.
+ </p>
+ <p>Any replacement termination function is required to kill the program
+ without returning; this one calls abort.
+ </p>
+ <p>For example:
+ </p>
+ <pre>
+ #include &lt;exception&gt;
+ #include &lt;stdexcept&gt;
+
+ struct argument_error : public std::runtime_error
+ {
+ argument_error(const std::string&amp; s): std::runtime_error(s) { }
+ };
+
+ int main(int argc)
+ {
+ std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
+ if (argc &gt; 5)
+ throw argument_error(&quot;argc is greater than 5!&quot;);
+ else
+ throw argc;
+ }
+ </pre>
+ <p>In GCC 3.1 and later, this gives
+ </p>
+ <pre>
+ % ./a.out
+ terminate called after throwing a `int'
+ Aborted
+ % ./a.out f f f f f f f f f f f
+ terminate called after throwing an instance of `argument_error'
+ what(): argc is greater than 5!
+ Aborted
+ %</pre>
+ <p>The 'Aborted' line comes from the call to abort(), of course.
+ </p>
+ <p><strong>UPDATE:</strong> Starting with GCC 3.4, this is the default
+ termination handler; nothing need be done to use it. To go back to
+ the previous &quot;silent death&quot; method, simply include
+ <code>&lt;exception&gt;</code> and <code>&lt;cstdlib&gt;</code>,
+ and call
+ </p>
+ <pre>
+ std::set_terminate(std::abort);</pre>
+
+<p>
+ This function will attempt to write to stderr. If your application
+ closes stderr or redirects it to an inappropriate location,
+ <code>__verbose_terminate_handler</code> will behave in an
+ unspecified manner.
+</p>
+
+ <p>Return <a href="#top">to top of page</a> or
+ <a href="../faq/index.html">to the FAQ</a>.
+ </p>
+
+
+<hr />
+<h2><a name="5">Dynamic memory management</a></h2>
+ <p>There are six flavors each of <code>new</code> and
+ <code>delete</code>, so make certain that you're using the right
+ ones! Here are quickie descriptions of <code>new</code>:
+ </p>
+ <ul>
+ <li>single object form, throwing a <code>bad_alloc</code> on errors;
+ this is what most people are used to using</li>
+ <li>single object &quot;nothrow&quot; form, returning NULL on errors</li>
+ <li>array new, throwing <code>bad_alloc</code> on errors</li>
+ <li>array nothrow new, returning NULL on errors</li>
+ <li>placement new, which does nothing (like it's supposed to)</li>
+ <li>placement array new, which also does nothing</li>
+ </ul>
+ <p>They are distinguished by the parameters that you pass to them, like
+ any other overloaded function. The six flavors of <code>delete</code>
+ are distinguished the same way, but none of them are allowed to throw
+ an exception under any circumstances anyhow. (They match up for
+ completeness' sake.)
+ </p>
+ <p>Remember that it is perfectly okay to call <code>delete</code> on a
+ NULL pointer! Nothing happens, by definition. That is not the
+ same thing as deleting a pointer twice.
+ </p>
+ <p>By default, if one of the &quot;throwing <code>new</code>s&quot; can't
+ allocate the memory requested, it tosses an instance of a
+ <code>bad_alloc</code> exception (or, technically, some class derived
+ from it). You can change this by writing your own function (called a
+ new-handler) and then registering it with <code>set_new_handler()</code>:
+ </p>
+ <pre>
+ typedef void (*PFV)(void);
+
+ static char* safety;
+ static PFV old_handler;
+
+ void my_new_handler ()
+ {
+ delete[] safety;
+ popup_window ("Dude, you are running low on heap memory. You
+ should, like, close some windows, or something.
+ The next time you run out, we're gonna burn!");
+ set_new_handler (old_handler);
+ return;
+ }
+
+ int main ()
+ {
+ safety = new char[500000];
+ old_handler = set_new_handler (&amp;my_new_handler);
+ ...
+ }
+ </pre>
+ <p><code>bad_alloc</code> is derived from the base <code>exception</code>
+ class defined in Chapter 19.
+ </p>
+ <p>Return <a href="#top">to top of page</a> or
+ <a href="../faq/index.html">to the FAQ</a>.
+ </p>
+
+<hr />
+<h2><a name="6">RTTI, the ABI, and demangling</a></h2>
+ <p>If you have read the <a href="../documentation.html#4">source
+ documentation</a> for <code> namespace abi </code> then you are aware
+ of the cross-vendor C++ ABI which we use. One of the exposed
+ functions is the one which we use for demangling in programs like
+ <code>c++filt</code>, and you can use it yourself as well.
+ </p>
+ <p>(The function itself might use different demanglers, but that's the
+ whole point of abstract interfaces. If we change the implementation,
+ you won't notice.)
+ </p>
+ <p>Probably the only times you'll be interested in demangling at runtime
+ are when you're seeing <code>typeid</code> strings in RTTI, or when
+ you're handling the runtime-support exception classes. For example:
+ </p>
+ <pre>
+#include &lt;exception&gt;
+#include &lt;iostream&gt;
+#include &lt;cxxabi.h&gt;
+
+struct empty { };
+
+template &lt;typename T, int N&gt;
+ struct bar { };
+
+
+int main()
+{
+ int status;
+ char *realname;
+
+ // exception classes not in &lt;stdexcept&gt;, thrown by the implementation
+ // instead of the user
+ std::bad_exception e;
+ realname = abi::__cxa_demangle(e.what(), 0, 0, &amp;status);
+ std::cout &lt;&lt; e.what() &lt;&lt; "\t=&gt; " &lt;&lt; realname &lt;&lt; "\t: " &lt;&lt; status &lt;&lt; '\n';
+ free(realname);
+
+
+ // typeid
+ bar&lt;empty,17&gt; u;
+ const std::type_info &amp;ti = typeid(u);
+
+ realname = abi::__cxa_demangle(ti.name(), 0, 0, &amp;status);
+ std::cout &lt;&lt; ti.name() &lt;&lt; "\t=&gt; " &lt;&lt; realname &lt;&lt; "\t: " &lt;&lt; status &lt;&lt; '\n';
+ free(realname);
+
+ return 0;
+}</pre>
+ <p>With GCC 3.1 and later, this prints
+ </p>
+ <pre>
+ St13bad_exception =&gt; std::bad_exception : 0
+ 3barI5emptyLi17EE =&gt; bar&lt;empty, 17&gt; : 0 </pre>
+ <p>The demangler interface is described in the source documentation
+ linked to above. It is actually written in C, so you don't need to
+ be writing C++ in order to demangle C++. (That also means we have to
+ use crummy memory management facilities, so don't forget to free()
+ the returned char array.)
+ </p>
+ <p>Return <a href="#top">to top of page</a> or
+ <a href="../faq/index.html">to the FAQ</a>.
+ </p>
+
+
+<!-- ####################################################### -->
+
+<hr />
+<p class="fineprint"><em>
+See <a href="../17_intro/license.html">license.html</a> for copying conditions.
+Comments and suggestions are welcome, and may be sent to
+<a href="mailto:libstdc++@gcc.gnu.org">the libstdc++ mailing list</a>.
+</em></p>
+
+
+</body>
+</html>
OpenPOWER on IntegriCloud