| Index: gcc/libstdc++-v3/doc/xml/manual/support.xml
|
| diff --git a/gcc/libstdc++-v3/doc/xml/manual/support.xml b/gcc/libstdc++-v3/doc/xml/manual/support.xml
|
| deleted file mode 100644
|
| index 6e0f75af910ad47638c0bd31e6c05836cd2c61ff..0000000000000000000000000000000000000000
|
| --- a/gcc/libstdc++-v3/doc/xml/manual/support.xml
|
| +++ /dev/null
|
| @@ -1,455 +0,0 @@
|
| -<?xml version='1.0'?>
|
| -<!DOCTYPE part PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
| - "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
|
| -[ ]>
|
| -
|
| -<part id="manual.support" xreflabel="Support">
|
| -<?dbhtml filename="support.html"?>
|
| -
|
| -<partinfo>
|
| - <keywordset>
|
| - <keyword>
|
| - ISO C++
|
| - </keyword>
|
| - <keyword>
|
| - library
|
| - </keyword>
|
| - </keywordset>
|
| -</partinfo>
|
| -
|
| -<title>
|
| - Support
|
| - <indexterm><primary>Support</primary></indexterm>
|
| -</title>
|
| -
|
| -<preface>
|
| - <title></title>
|
| - <para>
|
| - This part deals with the functions called and objects created
|
| - automatically during the course of a program's existence.
|
| - </para>
|
| -
|
| - <para>
|
| - 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.
|
| - </para>
|
| -</preface>
|
| -
|
| -<chapter id="manual.support.types" xreflabel="Types">
|
| - <?dbhtml filename="fundamental_types.html"?>
|
| - <title>Types</title>
|
| - <sect1 id="manual.support.types.fundamental" xreflabel="Fundamental Types">
|
| - <title>Fundamental Types</title>
|
| - <para>
|
| - C++ has the following builtin types:
|
| - </para>
|
| - <itemizedlist>
|
| - <listitem><para>
|
| - char
|
| - </para></listitem>
|
| - <listitem><para>
|
| - signed char
|
| - </para></listitem>
|
| - <listitem><para>
|
| - unsigned char
|
| - </para></listitem>
|
| - <listitem><para>
|
| - signed short
|
| - </para></listitem>
|
| - <listitem><para>
|
| - signed int
|
| - </para></listitem>
|
| - <listitem><para>
|
| - signed long
|
| - </para></listitem>
|
| - <listitem><para>
|
| - unsigned short
|
| - </para></listitem>
|
| - <listitem><para>
|
| - unsigned int
|
| - </para></listitem>
|
| - <listitem><para>
|
| - unsigned long
|
| - </para></listitem>
|
| - <listitem><para>
|
| - bool
|
| - </para></listitem>
|
| - <listitem><para>
|
| - wchar_t
|
| - </para></listitem>
|
| - <listitem><para>
|
| - float
|
| - </para></listitem>
|
| - <listitem><para>
|
| - double
|
| - </para></listitem>
|
| - <listitem><para>
|
| - long double
|
| - </para></listitem>
|
| - </itemizedlist>
|
| -
|
| - <para>
|
| - These fundamental types are always available, without having to
|
| - include a header file. These types are exactly the same in
|
| - either C++ or in C.
|
| - </para>
|
| -
|
| - <para>
|
| - Specializing parts of the library on these types is prohibited:
|
| - instead, use a POD.
|
| - </para>
|
| -
|
| - </sect1>
|
| - <sect1 id="manual.support.types.numeric_limits" xreflabel="Numeric Properties">
|
| - <title>Numeric Properties</title>
|
| -
|
| -
|
| - <para>
|
| - The header <filename class="headerfile">limits</filename> 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
|
| - <classname>numeric_limits</classname>, documented <ulink
|
| - url="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/structstd_1_1numeric__limits.html">here</ulink>
|
| - and defined as follows:
|
| - </para>
|
| -
|
| - <programlisting>
|
| - template<typename T>
|
| - 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;
|
| - };
|
| - </programlisting>
|
| - </sect1>
|
| -
|
| - <sect1 id="manual.support.types.null" xreflabel="NULL">
|
| - <title>NULL</title>
|
| - <para>
|
| - The only change that might affect people is the type of
|
| - <constant>NULL</constant>: while it is required to be a macro,
|
| - the definition of that macro is <emphasis>not</emphasis> allowed
|
| - to be <constant>(void*)0</constant>, which is often used in C.
|
| - </para>
|
| -
|
| - <para>
|
| - For <command>g++</command>, <constant>NULL</constant> is
|
| - <programlisting>#define</programlisting>'d to be
|
| - <constant>__null</constant>, a magic keyword extension of
|
| - <command>g++</command>.
|
| - </para>
|
| -
|
| - <para>
|
| - The biggest problem of #defining <constant>NULL</constant> to be
|
| - something like <quote>0L</quote> 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
|
| - <command>g++</command> has a magic extension, so that
|
| - <constant>NULL</constant> is always a pointer.)
|
| - </para>
|
| -
|
| - <para>In his book <ulink
|
| - url="http://www.awprofessional.com/titles/0-201-92488-9/"><emphasis>Effective
|
| - C++</emphasis></ulink>, 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
|
| - <constant>NULL</constant> that will match pointers before it
|
| - matches integers.
|
| - </para>
|
| - <para>See
|
| - <ulink url="http://www.awprofessional.com/titles/0-201-31015-5/">the
|
| - Effective C++ CD example</ulink>
|
| - </para>
|
| - </sect1>
|
| -
|
| -</chapter>
|
| -
|
| -<chapter id="manual.support.memory" xreflabel="Dynamic Memory">
|
| - <?dbhtml filename="dynamic_memory.html"?>
|
| - <title>Dynamic Memory</title>
|
| - <para>
|
| - There are six flavors each of <function>new</function> and
|
| - <function>delete</function>, so make certain that you're using the right
|
| - ones. Here are quickie descriptions of <function>new</function>:
|
| - </para>
|
| - <itemizedlist>
|
| - <listitem><para>
|
| - single object form, throwing a
|
| - <classname>bad_alloc</classname> on errors; this is what most
|
| - people are used to using
|
| - </para></listitem>
|
| - <listitem><para>
|
| - Single object "nothrow" form, returning NULL on errors
|
| - </para></listitem>
|
| - <listitem><para>
|
| - Array <function>new</function>, throwing
|
| - <classname>bad_alloc</classname> on errors
|
| - </para></listitem>
|
| - <listitem><para>
|
| - Array nothrow <function>new</function>, returning
|
| - <constant>NULL</constant> on errors
|
| - </para></listitem>
|
| - <listitem><para>
|
| - Placement <function>new</function>, which does nothing (like
|
| - it's supposed to)
|
| - </para></listitem>
|
| - <listitem><para>
|
| - Placement array <function>new</function>, which also does
|
| - nothing
|
| - </para></listitem>
|
| - </itemizedlist>
|
| - <para>
|
| - They are distinguished by the parameters that you pass to them, like
|
| - any other overloaded function. The six flavors of <function>delete</function>
|
| - 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.)
|
| - </para>
|
| - <para>
|
| - Remember that it is perfectly okay to call <function>delete</function> on a
|
| - NULL pointer! Nothing happens, by definition. That is not the
|
| - same thing as deleting a pointer twice.
|
| - </para>
|
| - <para>
|
| - By default, if one of the <quote>throwing <function>new</function>s</quote> can't
|
| - allocate the memory requested, it tosses an instance of a
|
| - <classname>bad_alloc</classname> 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 <function>set_new_handler()</function>:
|
| - </para>
|
| - <programlisting>
|
| - 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 (&my_new_handler);
|
| - ...
|
| - }
|
| - </programlisting>
|
| - <para>
|
| - <classname>bad_alloc</classname> is derived from the base <classname>exception</classname>
|
| - class defined in Chapter 19.
|
| - </para>
|
| -</chapter>
|
| -
|
| -<chapter id="manual.support.termination" xreflabel="Termination">
|
| - <?dbhtml filename="termination.html"?>
|
| - <title>Termination</title>
|
| - <sect1 id="support.termination.handlers" xreflabel="Termination Handlers">
|
| - <title>Termination Handlers</title>
|
| - <para>
|
| - Not many changes here to <filename
|
| - class="headerfile">cstdlib</filename>. You should note that the
|
| - <function>abort()</function> 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 <function>atexit()</function>
|
| - don't get called either, so you can forget about that
|
| - possibility, too.)
|
| - </para>
|
| - <para>
|
| - The good old <function>exit()</function> function can be a bit
|
| - funky, too, until you look closer. Basically, three points to
|
| - remember are:
|
| - </para>
|
| - <orderedlist>
|
| - <listitem>
|
| - <para>
|
| - Static objects are destroyed in reverse order of their creation.
|
| - </para>
|
| - </listitem>
|
| - <listitem>
|
| - <para>
|
| - Functions registered with <function>atexit()</function> are called in
|
| - reverse order of registration, once per registration call.
|
| - (This isn't actually new.)
|
| - </para>
|
| - </listitem>
|
| - <listitem>
|
| - <para>
|
| - The previous two actions are <quote>interleaved,</quote> that is,
|
| - given this pseudocode:
|
| - </para>
|
| -<programlisting>
|
| - extern "C or C++" void f1 (void);
|
| - extern "C or C++" void f2 (void);
|
| -
|
| - static Thing obj1;
|
| - atexit(f1);
|
| - static Thing obj2;
|
| - atexit(f2);
|
| -</programlisting>
|
| - <para>
|
| - then at a call of <function>exit()</function>,
|
| - <varname>f2</varname> will be called, then
|
| - <varname>obj2</varname> will be destroyed, then
|
| - <varname>f1</varname> will be called, and finally
|
| - <varname>obj1</varname> will be destroyed. If
|
| - <varname>f1</varname> or <varname>f2</varname> allow an
|
| - exception to propagate out of them, Bad Things happen.
|
| - </para>
|
| - </listitem>
|
| - </orderedlist>
|
| - <para>
|
| - Note also that <function>atexit()</function> 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 <function>xatexit</function>/<function>xexit</function> combination from <literal>libiberty</literal>, which has no such limit.
|
| - </para>
|
| - </sect1>
|
| -
|
| - <sect1 id="support.termination.verbose" xreflabel="Verbose Terminate Handler">
|
| - <?dbhtml filename="verbose_termination.html"?>
|
| - <title>Verbose Terminate Handler</title>
|
| - <para>
|
| - 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, the verbose terminate handler.
|
| - </para>
|
| -
|
| -<programlisting>
|
| -#include <exception>
|
| -
|
| -int main()
|
| -{
|
| - std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
|
| - ...
|
| -
|
| - throw <replaceable>anything</replaceable>;
|
| -}
|
| -</programlisting>
|
| -
|
| - <para>
|
| - The <function>__verbose_terminate_handler</function> function
|
| - obtains the name of the current exception, attempts to demangle
|
| - it, and prints it to stderr. If the exception is derived from
|
| - <classname>exception</classname> then the output from
|
| - <function>what()</function> will be included.
|
| - </para>
|
| -
|
| - <para>
|
| - Any replacement termination function is required to kill the
|
| - program without returning; this one calls abort.
|
| - </para>
|
| -
|
| - <para>
|
| - For example:
|
| - </para>
|
| -
|
| -<programlisting>
|
| -#include <exception>
|
| -#include <stdexcept>
|
| -
|
| -struct argument_error : public std::runtime_error
|
| -{
|
| - argument_error(const std::string& s): std::runtime_error(s) { }
|
| -};
|
| -
|
| -int main(int argc)
|
| -{
|
| - std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
|
| - if (argc > 5)
|
| - throw argument_error(<quote>argc is greater than 5!</quote>);
|
| - else
|
| - throw argc;
|
| -}
|
| -</programlisting>
|
| -
|
| - <para>
|
| - With the verbose terminate handler active, this gives:
|
| - </para>
|
| -
|
| - <screen>
|
| - <computeroutput>
|
| - % ./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
|
| - </computeroutput>
|
| - </screen>
|
| -
|
| - <para>
|
| - The 'Aborted' line comes from the call to
|
| - <function>abort()</function>, of course.
|
| - </para>
|
| -
|
| - <para>
|
| - This is the default termination handler; nothing need be done to
|
| - use it. To go back to the previous <quote>silent death</quote>
|
| - method, simply include <filename>exception</filename> and
|
| - <filename>cstdlib</filename>, and call
|
| - </para>
|
| -
|
| - <programlisting>
|
| - std::set_terminate(std::abort);
|
| - </programlisting>
|
| -
|
| - <para>
|
| - After this, all calls to <function>terminate</function> will use
|
| - <function>abort</function> as the terminate handler.
|
| - </para>
|
| -
|
| - <para>
|
| - Note: the verbose terminate handler will attempt to write to
|
| - stderr. If your application closes stderr or redirects it to an
|
| - inappropriate location,
|
| - <function>__verbose_terminate_handler</function> will behave in
|
| - an unspecified manner.
|
| - </para>
|
| -
|
| - </sect1>
|
| -</chapter>
|
| -
|
| -</part>
|
|
|