| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> |
| <meta name="KEYWORDS" content="libstdc++, libstdc++-v3, GCC, g++, libg++, STL"> |
| <meta name="DESCRIPTION" content="FAQ for the GNU libstdc++ effort."> |
| <title>libstdc++-v3 FAQ</title> |
| <link rel="StyleSheet" href="../lib3styles.css"> |
| <!-- |
| ** Locations of "the most recent snapshot is the Nth" text are |
| ** answers 1_1, 1_4, 4_1. |
| --> |
| </head> |
| <body> |
| |
| <h1 class="centered">libstdc++ Frequently Asked Questions</h1> |
| |
| <p>The latest version of this document is always available at |
| <a href="http://gcc.gnu.org/onlinedocs/libstdc++/faq/"> |
| http://gcc.gnu.org/onlinedocs/libstdc++/faq/</a>.</p> |
| |
| <p>To the <a href="http://gcc.gnu.org/libstdc++/">libstdc++-v3 homepage</a>. |
| |
| <!-- ####################################################### --> |
| <hr> |
| <h1>Questions</h1> |
| <ol> |
| <li><a href="#1_0">General Information</a> |
| <!-- I suspect these will mostly be links to/into existing documents. --> |
| <ol> |
| <li><a href="#1_1">What is libstdc++-v3?</a> |
| <li><a href="#1_2">Why should I use libstdc++?</a> |
| <li><a href="#1_3">Who's in charge of it?</a> |
| <li><a href="#1_4">How do I get libstdc++?</a> |
| <li><a href="#1_5">When is libstdc++ going to be finished?</a> |
| <li><a href="#1_6">How do I contribute to the effort?</a> |
| <li><a href="#1_7">What happened to libg++? I need that!</a> |
| <li><a href="#1_8">What if I have more questions?</a> |
| <li><a href="#1_9">What are the license terms for libstdc++-v3?</a> |
| </ol> |
| |
| <li><a href="#2_0">Installation</a> |
| <ol> |
| <li><a href="#2_1">How do I install libstdc++-v3?</a> |
| <li><a href="#2_2">[removed]</a> |
| <li><a href="#2_3">What is this CVS thing that you keep |
| mentioning?</a> |
| <li><a href="#2_4">How do I know if it works?</a> |
| <li><a href="#2_5">This library is HUGE! And what's libsupc++?</a> |
| </ol> |
| |
| <li><a href="#3_0">Platform-Specific Issues</a> |
| <ol> |
| <li><a href="#3_1">Can libstdc++-v3 be used with <my |
| favorite compiler>?</a> |
| <li><a href="#3_2">[removed]</a> |
| <li><a href="#3_3">Building under DEC OSF kills the assembler</a> |
| <li><a href="#3_4">I can't use 'long long' on Solaris</a> |
| </ol> |
| |
| <li><a href="#4_0">Known Bugs and Non-Bugs</a> |
| <ol> |
| <li><a href="#4_1">What works already?</a> |
| <li><a href="#4_2">Bugs in gcc/g++ (not libstdc++-v3)</a> |
| <li><a href="#4_3">Bugs in the C++ language/lib specification</a> |
| <li><a href="#4_4">Things in libstdc++ that look like bugs</a> |
| <ul> |
| <li><a href="#4_4_iostreamclear">reopening a stream fails</a> |
| <li><a href="#4_4_Weff">-Weffc++ complains too much</a> |
| <li><a href="#4_4_rel_ops">"ambiguous overloads" |
| after including an old-style header</a> |
| <li><a href="#4_4_interface">The g++-3 headers are |
| <strong>not ours</strong></a> |
| <li><a href="#4_4_glibc">compilation errors from streambuf.h</a> |
| <li><a href="#4_4_checks">errors about <em>*Cconcept</em> and |
| <em>constraints</em> in the STL...</a> |
| </ul> |
| <li><a href="#4_5">Aw, that's easy to fix!</a> |
| </ol> |
| |
| <li><a href="#5_0">Miscellaneous</a> |
| <ol> |
| <li><a href="#5_1">string::iterator is not char*; |
| vector<T>::iterator is not T*</a> |
| <li><a href="#5_2">What's next after libstdc++-v3?</a> |
| <li><a href="#5_3">What about the STL from SGI?</a> |
| <li><a href="#5_4">Extensions and Backward Compatibility</a> |
| <li><a href="#5_5">[removed]</a> |
| <li><a href="#5_6">Is libstdc++-v3 thread-safe?</a> |
| <li><a href="#5_7">How do I get a copy of the ISO C++ Standard?</a> |
| <li><a href="#5_8">What's an ABI and why is it so messy?</a> |
| </ol> |
| |
| </ol> |
| |
| <hr> |
| |
| <!-- ####################################################### --> |
| |
| <h1><a name="1_0">1.0 General Information</a></h1> |
| <!-- I suspect these will mostly be links to/into existing documents. --> |
| <h2><a name="1_1">1.1 What is libstdc++-v3?</a></h2> |
| <p>The GNU Standard C++ Library v3 is an |
| ongoing project to implement the ISO 14882 Standard C++ library |
| as described in chapters 17 through 27 and annex D. As the |
| library reaches stable plateaus, it is captured in a snapshot |
| and released. The current release is |
| <a href="http://gcc.gnu.org/libstdc++/download.html">the |
| twelfth snapshot</a>. For those who want to see exactly how |
| far the project has come, or just want the latest |
| bleeding-edge code, the up-to-date source is available over |
| anonymous CVS, and can even be browsed over the Web (see below). |
| </p> |
| <p>The older libstdc++-v2 project is no longer maintained; the code |
| has been completely replaced and rewritten. |
| <a href="#4_4_interface">If you are using V2</a>, then you need to |
| report bugs to your system vendor, not to the V3 list. |
| </p> |
| <p>A more formal description of the V3 goals can be found in the |
| official <a href="../17_intro/DESIGN">design document</a>. |
| </p> |
| |
| <hr> |
| <h2><a name="1_2">1.2 Why should I use libstdc++?</a></h2> |
| <p>The completion of the ISO C++ standardization gave the |
| C++ community a powerful set of reuseable tools in the form |
| of the C++ Standard Library. However, all existing C++ |
| implementations are (as the Draft Standard used to say) |
| "incomplet and incorrekt," and many suffer from |
| limitations of the compilers that use them. |
| </p> |
| <p>The GNU C/C++/FORTRAN/<pick-a-language> compiler |
| (<code>gcc</code>, <code>g++</code>, etc) is widely considered to be |
| one of the leading compilers in the world. Its development |
| has recently been taken over by the |
| <a href="http://gcc.gnu.org/">GCC team</a>. All of |
| the rapid development and near-legendary |
| <a href="http://gcc.gnu.org/gcc-2.95/buildstat.html">portability</a> |
| that are the hallmarks of an open-source project are being |
| applied to libstdc++. |
| </p> |
| <p>That means that all of the Standard classes and functions |
| (such as <code>string</code>, <code>vector<></code>, iostreams, |
| and algorithms) will be freely available and fully compliant. |
| Programmers will no longer need to "roll their own" |
| nor be worried about platform-specific incompatibilities. |
| </p> |
| |
| <hr> |
| <h2><a name="1_3">1.3 Who's in charge of it?</a></h2> |
| <p>The libstdc++ project is contributed to by several developers |
| all over the world, in the same way as GCC or Linux. |
| Benjamin Kosnik, Gabriel Dos Reis, Phil Edwards, and Ulrich |
| Drepper are the lead maintainers of the CVS archive. |
| </p> |
| <p>Development and discussion is held on the libstdc++ mailing |
| list. Subscribing to the list, or searching the list |
| archives, is open to everyone. You can read instructions for |
| doing so on the <a href="http://gcc.gnu.org/libstdc++/">homepage</a>. |
| If you have questions, ideas, code, or are just curious, sign up! |
| </p> |
| |
| <hr> |
| <h2><a name="1_4">1.4 How do I get libstdc++?</a></h2> |
| <p>The twelfth (and latest) snapshot of libstdc++-v3 is |
| <a href="http://gcc.gnu.org/libstdc++/download.html">available via |
| ftp</a>. |
| </p> |
| <p>The <a href="http://gcc.gnu.org/libstdc++/">homepage</a> |
| has instructions for retrieving the latest CVS sources, and for |
| browsing the CVS sources over the web. |
| </p> |
| <p>The subset commonly known as the Standard Template Library |
| (chapters 23 through 25, mostly) is adapted from the final release |
| of the SGI STL. |
| </p> |
| |
| <hr> |
| <h2><a name="1_5">1.5 When is libstdc++ going to be finished?</a></h2> |
| <!-- <p>Nathan Myers gave the best of all possible answers in <A |
| href="http://www.deja.com/getdoc.xp?AN=469581698&fmt=text">a |
| Usenet article</a>.</p> |
| which is no longer available, thanks deja...--> |
| <p>Nathan Myers gave the best of all possible answers, responding to a |
| Usenet article asking this question: <em>Sooner, if you help.</em> |
| </p> |
| |
| <hr> |
| <h2><a name="1_6">1.6 How do I contribute to the effort?</a></h2> |
| <p>Here is <a href="../17_intro/contribute.html">a |
| page devoted to this topic</a>. Subscribing to the mailing |
| list (see above, or the homepage) is a very good idea if you |
| have something to contribute, or if you have spare time and |
| want to help. Contributions don't have to be in the form of |
| source code; anybody who is willing to help write |
| documentation, for example, or has found a bug in code that |
| we all thought was working, is more than welcome! |
| </p> |
| |
| <hr> |
| <h2><a name="1_7">1.7 What happened to libg++? I need that!</a></h2> |
| <p>The most recent libg++ README states that libg++ is no longer |
| being actively maintained. It should not be used for new |
| projects, and is only being kicked along to support older code. |
| </p> |
| <p>The libg++ was designed and created when there was no Standard |
| to provide guidance. Classes like linked lists are now provided |
| for by <code>list<T></code> and do not need to be created by |
| <code>genclass</code>. (For that matter, templates exist now and |
| are well-supported, whereas genclass (mostly) predates them.) |
| </p> |
| <p>There are other classes in libg++ that are not specified in the |
| ISO Standard (e.g., statistical analysis). While there are a |
| lot of really useful things that are used by a lot of people |
| (e.g., statistics :-), the Standards Committee couldn't include |
| everything, and so a lot of those "obvious" classes |
| didn't get included. |
| </p> |
| <p>Since libstdc++ is an implementation of the Standard Library, we |
| have no plans at this time to include non-Standard utilities |
| in the implementation, however handy they are. (The extensions |
| provided in the SGI STL aren't maintained by us and don't get |
| a lot of our attention, because they don't require a lot of our |
| time.) It is entirely plausable that the "useful stuff" |
| from libg++ might be extracted into an updated utilities library, |
| but nobody has stated such a project yet. |
| </p> |
| <!-- The advertisement, so to speak, might have to go. Hmmmmm. --> |
| <p>(The <a href="http://www.boost.org/">Boost</a> site houses free |
| C++ libraries that do varying things, and happened to be started |
| by members of the Standards Committee. Certain "useful |
| stuff" classes will probably migrate there.) |
| </p> |
| <p>For the bold and/or desperate, the |
| <a href="http://gcc.gnu.org/fom_serv/cache/33.html">GCC FAQ</a> |
| describes where to find the last libg++ source. |
| </p> |
| |
| <hr> |
| <h2><a name="1_8">1.8 What if I have more questions?</a></h2> |
| <p>If you have read the README and RELEASE-NOTES files, and your |
| question remains unanswered, then just ask the mailing list. |
| At present, you do not need to be subscribed to the list to |
| send a message to it. More information is available on the |
| homepage (including how to browse the list archives); to send |
| to the list, use <a href="mailto:libstdc++@gcc.gnu.org"> |
| <code>libstdc++@gcc.gnu.org</code></a>. |
| </p> |
| <p>If you have a question that you think should be included here, |
| or if you have a question <em>about</em> a question/answer here, |
| contact <a href="mailto:pme@gcc.gnu.org">Phil Edwards</a> |
| or <a href="mailto:gdr@gcc.gnu.org">Gabriel Dos Reis</a>. |
| </p> |
| |
| <hr> |
| <h2><a name="1_9">1.9 What are the license terms for libstdc++-v3?</a></h2> |
| <p>See <a href="../17_intro/license.html">our license description</a> |
| for these and related questions. |
| </p> |
| |
| <hr> |
| <h1><a name="2_0">2.0 Installation</a></h1> |
| <h2><a name="2_1">2.1 How do I install libstdc++-v3?</a></h2> |
| <p>Complete instructions are not given here (this is a FAQ, not |
| an installation document), but the tools required are few: |
| </p> |
| <ul> |
| <li> A 3.x release of GCC. Note that building GCC is much |
| easier and more automated than building the GCC 2.[78] |
| series was. If you are using GCC 2.95, you can still |
| build earlier snapshots of libstdc++. |
| <li> GNU Make is recommended, but should not be required. |
| <li> The GNU Autotools are needed if you are messing with |
| the configury or makefiles. |
| </ul> |
| <p>The file <a href="../documentation.html">documentation.html</a> |
| provides a good overview of the steps necessary to build, install, |
| and use the library. Instructions for configuring the library |
| with new flags such as --enable-threads are there also, as well as |
| patches and instructions for working with GCC 2.95. |
| </p> |
| <p>The top-level install.html and |
| <a href="../17_intro/RELEASE-NOTES">RELEASE-NOTES</a> files contain |
| the exact build and installation instructions. You may wish to |
| browse those files over CVSweb ahead of time to get a feel for |
| what's required. RELEASE-NOTES is located in the |
| ".../docs/17_intro/" directory of the distribution. |
| </p> |
| |
| <hr> |
| <h2><a name="2_2">2.2 [removed]</a></h2> |
| <p>This question has become moot and has been removed. The stub |
| is here to preserve numbering (and hence links/bookmarks). |
| </p> |
| |
| <hr> |
| <h2><a name="2_3">2.3 What is this CVS thing that you |
| keep mentioning?</a></h2> |
| <p>The <em>Concurrent Versions System</em> is one of several revision |
| control packages. It was selected for GNU projects because it's |
| free (speech), free (beer), and very high quality. The <A |
| href="http://www.gnu.org/software/cvs/cvs.html">CVS entry in |
| the GNU software catalogue</a> has a better description as |
| well as a |
| <a href="http://www.cvshome.org/">link to the makers of CVS</a>. |
| </p> |
| <p>The "anonymous client checkout" feature of CVS is |
| similar to anonymous FTP in that it allows anyone to retrieve |
| the latest libstdc++ sources. |
| </p> |
| <p>After the first of April, American users will have a |
| "/pharmacy" command-line option... |
| <!-- wonder how long that'll live --> |
| </p> |
| |
| <hr> |
| <h2><a name="2_4">2.4 How do I know if it works?</a></h2> |
| <p>libstdc++-v3 comes with its own testsuite. You do not need |
| to actually install the library ("<code>make |
| install</code>") to run the testsuite. |
| </p> |
| <p>To run the testsuite on the library after building it, use |
| "make check" while in your build directory. To run |
| the testsuite on the library after building and installing it, |
| use "make check-install" instead. |
| </p> |
| <p>If you find bugs in the testsuite programs themselves, or if you |
| think of a new test program that should be added to the suite, |
| <strong>please</strong> write up your idea and send it to the list! |
| </p> |
| |
| <hr> |
| <h2><a name="2_5">2.4 This library is HUGE! And what's libsupc++?</a></h2> |
| <p>Usually the size of libraries on disk isn't noticeable. When a |
| link editor (or simply "linker") pulls things from a |
| static archive library, only the necessary object files are copied |
| into your executable, not the entire library. Unfortunately, even |
| if you only need a single function or variable from an object file, |
| the entire object file is extracted. (There's nothing unique to C++ |
| or libstdc++-v3 about this; it's just common behavior, given here |
| for background reasons.) |
| </p> |
| <p>Some of the object files which make up libstdc++.a are rather large. |
| If you create a statically-linked executable with |
| <code> -static</code>, those large object files are suddenly part |
| of your executable. Historically the best way around this was to |
| only place a very few functions (often only a single one) in each |
| source/object file; then extracting a single function is the same |
| as extracting a single .o file. For libstdc++-v3 this is only |
| possible to a certain extent; the object files in question contain |
| template classes and template functions, pre-instantiated, and |
| splitting those up causes severe maintenance headaches. |
| </p> |
| <p>It's not a bug, and it's not really a problem. Nevertheless, some |
| people don't like it, so here are two pseudo-solutions: |
| </p> |
| <p>If the only functions from libstdc++.a which you need are language |
| support functions (those listed in |
| <a href="../18_support/howto.html">clause 18</a> of the standard, |
| e.g., <code>new</code> and <code>delete</code>), then try linking |
| against <code>libsupc++.a</code> (usually specifying |
| <code>-lsupc++</code> when calling g++ for the final link step will |
| do it). This library contains only those support routines, one per |
| object file. But if you are using anything from the rest of the |
| library, such as IOStreams or vectors, then you'll still need |
| pieces from <code>libstdc++.a</code>. |
| </p> |
| <p>The second method is one we hope to incorporate into the library |
| build process. Some platforms can place each function and variable |
| into its own section in a .o file. The GNU linker can then perform |
| garbage collection on unused sections; this reduces the situation |
| to only copying needed functions into the executable, as before, |
| but all happens automatically. |
| </p> |
| <p>Unfortunately the garbage collection in GNU ld is buggy; sections |
| (corresponding to functions and variables) which <em>are</em> used |
| are mistakenly removed, leading to horrible crashes when your |
| executable starts up. For the time being, this feature is not used |
| when building the library. |
| </p> |
| |
| <hr> |
| <h1><a name="3_0">3.0 Platform-Specific Issues</a></h1> |
| <h2><a name="3_1">3.1 Can libstdc++-v3 be used with <my |
| favorite compiler>?</a></h2> |
| <p>Probably not. Yet.</p> |
| <p>Because GCC advances so rapidly, development and testing of |
| libstdc++ is being done almost entirely under that compiler. |
| If you are curious about whether other, lesser compilers |
| (*grin*) support libstdc++, you are more than welcome to try. |
| Configuring and building the library (see above) will still |
| require certain tools, however. Also keep in mind that |
| <em>building</em> libstdc++ does not imply that your compiler |
| will be able to <em>use</em> all of the features found in the |
| C++ Standard Library. |
| </p> |
| <p>Since the goal of ISO Standardization is for all C++ |
| implementations to be able to share code, the final libstdc++ |
| should, in theory, be usable under any ISO-compliant |
| compiler. It will still be targeted and optimized for |
| GCC/g++, however. |
| </p> |
| |
| <hr> |
| <h2><a name="3_2">3.2 [removed]</a></h2> |
| <p>This question has become moot and has been removed. The stub |
| is here to preserve numbering (and hence links/bookmarks). |
| </p> |
| |
| <hr> |
| <h2><a name="3_3">3.3 Building DEC OSF kills the assembler</a></h2> |
| <p>The <code>atomicity.h</code> header for the Alpha processor |
| currently uses pseudo-operators which the DEC assembler |
| doesn't understand (in particular, .subsection and .previous). |
| The simple solution is to install GNU <code>as</code> and arrange |
| for the GCC build to use it (or merge the sources and build |
| it during the bootstrap). |
| </p> |
| <p>Anyone who |
| <a href="http://gcc.gnu.org/ml/libstdc++/2000-12/msg00279.html">knows |
| the DEC assembler well enough</a> to provide the equivalent of |
| these two pseudos would win praise and accolades from many. |
| </p> |
| |
| <hr> |
| <h2><a name="3_4">3.4 I can't use 'long long' on Solaris</a></h2> |
| <p>By default we try to support the C99 <code>long long</code> type. |
| This requires that certain functions from your C library be present. |
| </p> |
| <p>Up through release 3.0.2 the tests performed were too general, and |
| this feature was disabled when it did not need to be. The most |
| commonly reported platform affected was Solaris. |
| </p> |
| <p>This has been fixed for 3.0.3 and onwards. |
| </p> |
| |
| <hr> |
| <h1><a name="4_0">4.0 Known Bugs and Non-Bugs</a></h1> |
| <em>Note that this section can get rapdily outdated -- such is the |
| nature of an open-source project. For the latest information, join |
| the mailing list or look through recent archives. The RELEASE- |
| NOTES and BUGS files are generally kept up-to-date.</em> |
| |
| <p>For 3.0.1, the most common "bug" is an apparently missing |
| "<code>../</code>" in include/Makefile, resulting in files |
| like gthr.h and gthr-single.h not being found. |
| </p> |
| <p>Please read |
| <a href="http://gcc.gnu.org/install/configure.html">the configuration |
| instructions for GCC</a>, |
| specifically the part about configuring in a separate build directory, |
| and how strongly recommended it is. Building in the source directory |
| is fragile, is rarely tested, and tends to break, as in this case. |
| This was fixed for 3.0.2. |
| </p> |
| <p><strong>Please do not report these as bugs. We know about them.</strong> |
| Reporting this -- or any other problem that's already been fixed -- |
| hinders the development of GCC, because we have to take time to |
| respond to your report. Thank you. |
| </p> |
| |
| <h2><a name="4_1">4.1 What works already?</a></h2> |
| <p>This is a verbatim clip from the "Status" section |
| of the RELEASE-NOTES for the latest snapshot. |
| </p> |
| |
| <!-- Yeah, I meant that "verbatim clip" thing literally... :-) --> |
| |
| <pre> |
| New: |
| --- |
| - add S390, m68k, x86-64 support. |
| - doxygen documentation has been extended, including man pages. |
| - verbose terminate handling has been added. |
| - some libsupc++ tweaks |
| - warnings for deprecated headers now active. |
| - dejagnu testsuite preliminary documentation. |
| - dejagnu testsuite default. |
| - dejagnu testsuite cross compiler, multilib safe. |
| - long long iostreams on by default, rework of ISO C99 support. |
| - iterator re-write and testsuites. |
| - container testsuites. |
| - allocator revamp and testsuites. |
| - more concept-checking work. |
| - basic_string optimization and MT fixes. |
| - new limits implementation. |
| - update -fno-exceptions code, verify it works. |
| - full named locale support fpr all facets, choice of gnu, |
| ieee_1003.1-200x (POSIX 2), or generic models. Full support depends |
| on target OS and underlying "C" library support. |
| </pre> |
| |
| |
| <hr> |
| <h2><a name="4_2">4.2 Bugs in gcc/g++ (not libstdc++-v3)</a></h2> |
| <p>This is by no means meant to be complete nor exhaustive, but |
| mentions some problems that users may encounter when building |
| or using libstdc++. If you are experiencing one of these |
| problems, you can find more information on the libstdc++ and |
| the GCC mailing lists. |
| </p> |
| <ul> |
| <li>As of 3.0.95, those bugs have all been fixed. We look forward |
| to new ones, well, not exactly... Existing bugs are listed in |
| the BUGS file, and the GCC GNATS database. |
| </ul> |
| |
| <hr> |
| <h2><a name="4_3">4.3 Bugs in the C++ language/lib specification</a></h2> |
| <p>Yes, unfortunately, there are some. In a |
| <a href="http://gcc.gnu.org/ml/libstdc++/1998/msg00006.html">message |
| to the list</a>, Nathan Myers announced that he has started a list of |
| problems in the ISO C++ Standard itself, especially with |
| regard to the chapters that concern the library. The list |
| itself is |
| <a href="http://www.cantrip.org/draft-bugs.txt">posted on his |
| website</a>. Developers who are having problems interpreting |
| the Standard may wish to consult his notes. |
| </p> |
| <p>For those people who are not part of the ISO Library Group |
| (i.e., nearly all of us needing to read this page in the first |
| place :-), a public list of the library defects is occasionally |
| published <a href="http://anubis.dkuug.dk/jtc1/sc22/wg21/">here</a>. |
| Some of these have resulted in <a href="#5_2">code changes</a>. |
| </p> |
| |
| <hr> |
| <h2><a name="4_4">4.4 Things in libstdc++ that look like bugs</a></h2> |
| <p>There are things which are not bugs in the compiler (4.2) nor |
| the language specification (4.3), but aren't really bugs in |
| libstdc++, either. Really! Please do not report these as bugs. |
| </p> |
| <a name="4_4_Weff"> |
| <p><strong>-Weffc++</strong> |
| The biggest of these is the quadzillions of warnings about the |
| library headers emitted when <code>-Weffc++</code> is used. Making |
| libstdc++ "-Weffc++-clean" is not a goal of the project, |
| for a few reasons. Mainly, that option tries to enforce |
| object-oriented programming, while the Standard Library isn't |
| necessarily trying to be OO. There are multiple solutions |
| under discussion. |
| </p> |
| </a> |
| <a name="4_4_iostreamclear"> |
| <p><strong>reopening a stream fails</strong> |
| Did I just say that -Weffc++ was our biggest false-bug report? I |
| lied. (It used to be.) Today it seems to be reports that after |
| executing a sequence like |
| <pre> |
| #include <fstream> |
| ... |
| std::fstream fs("a_file"); |
| // . |
| // . do things with fs... |
| // . |
| fs.close(); |
| fs.open("a_new_file");</pre> |
| all operations on the re-opened <code>fs</code> will fail, or at |
| least act very strangely. Yes, they often will, especially if |
| <code>fs</code> reached the EOF state on the previous file. The |
| reason is that the state flags are <strong>not</strong> cleared |
| on a successful call to open(). The standard unfortunately did |
| not specify behavior in this case, and to everybody's great sorrow, |
| the <a href="../ext/howto.html#5">proposed LWG resolution</a> (see |
| DR #22) is to leave the flags unchanged. You must insert a call |
| to <code>fs.clear()</code> between the calls to close() and open(), |
| and then everything will work like we all expect it to work. |
| </p> |
| </a> |
| <a name="4_4_rel_ops"> |
| <p><strong>rel_ops</strong> |
| Another is the <code>rel_ops</code> namespace and the template |
| comparison operator functions contained therein. If they become |
| visible in the same namespace as other comparison functions |
| (e.g., '<code>using</code>' them and the <iterator> header), |
| then you will suddenly be faced with huge numbers of ambiguity |
| errors. This was discussed on the -v3 list; Nathan Myers |
| <a href="http://gcc.gnu.org/ml/libstdc++/2001-01/msg00247.html">sums |
| things up here</a>. |
| </p> |
| </a> |
| <a name="4_4_interface"><h3>The g++-3 headers are |
| <em>not ours</em></h3> |
| <p>If you have found an extremely broken header file which is |
| causing problems for you, look carefully before submitting a |
| "high" priority bug report (which you probably shouldn't |
| do anyhow; see the last paragraph of the page describing |
| <a href="http://gcc.gnu.org/gnatswrite.html">the GCC bug database</a>). |
| </p> |
| <p>If the headers are in <code>${prefix}/include/g++-3</code>, or if |
| the installed library's name looks like <code>libstdc++-2.10.a</code> |
| or <code>libstdc++-libc6-2.10.so</code>, |
| then you are using the old libstdc++-v2 library, which is nonstandard |
| and unmaintained. Do not report problems with -v2 to the -v3 |
| mailing list. |
| </p> |
| <p>Currently our header files are installed in |
| <code>${prefix}/include/g++-v3</code> (see the 'v'?). This may |
| change with the next release of GCC, as it may be too confusing, |
| but <a href="http://gcc.gnu.org/ml/gcc/2000-10/msg00732.html">the |
| question has not yet been decided</a>. |
| </p> |
| </a> |
| <a name="4_4_glibc"> |
| <p><strong>glibc</strong> |
| If you're on a GNU/Linux system and have just upgraded to |
| glibc 2.2, but are still using gcc 2.95.2, then you should have |
| read the glibc FAQ, specifically 2.34: |
| <pre> |
| 2.34. When compiling C++ programs, I get a compilation error in streambuf.h. |
| |
| {BH} You are using g++ 2.95.2? After upgrading to glibc 2.2, you need to |
| apply a patch to the include files in /usr/include/g++, because the fpos_t |
| type has changed in glibc 2.2. The patch is at |
| http://clisp.cons.org/~haible/gccinclude-glibc-2.2-compat.diff |
| </pre> |
| Note that 2.95.x shipped with the |
| <a href="#4_4_interface">old v2 library</a> which is no longer |
| maintained. Also note that gcc 2.95.3 fixes this problem, but |
| requires a separate patch for libstdc++-v3. |
| </p> |
| </a> |
| <a name="4_4_checks"> |
| <p><strong>concept checks</strong> |
| If you see compilation errors containing messages about |
| <code> <em>foo</em>Concept </code>and a<code> constraints </code> |
| member function, then most likely you have violated one of the |
| requirements for types used during instantiation of template |
| containers and functions. For example, EqualityComparableConcept |
| appears if your types must be comparable with == and you have not |
| provided this capability (a typo, or wrong visibility, or you |
| just plain forgot, etc). |
| </p> |
| <p>More information, including how to optionally enable/disable the |
| checks, is available |
| <a href="../19_diagnostics/howto.html#3">here</a>. |
| </p> |
| </a> |
| |
| <hr> |
| <h2><a name="4_5">4.5 Aw, that's easy to fix!</a></h2> |
| <p>If you have found a bug in the library and you think you have |
| a working fix, then send it in! The main GCC site has a page |
| on <a href="http://gcc.gnu.org/contribute.html">submitting |
| patches</a> that covers the procedure, but for libstdc++ you |
| should also send the patch to our mailing list in addition to |
| the GCC patches mailing list. The libstdc++ |
| <a href="../17_intro/contribute.html">contributors' page</a> |
| also talks about how to submit patches. |
| </p> |
| <p>In addition to the description, the patch, and the ChangeLog |
| entry, it is a Good Thing if you can additionally create a small |
| test program to test for the presence of the bug that your |
| patch fixes. Bugs have a way of being reintroduced; if an old |
| bug creeps back in, it will be caught immediately by the |
| <a href="#2_4">testsuite</a> -- but only if such a test exists. |
| </p> |
| |
| <hr> |
| <h1><a name="5_0">5.0 Miscellaneous</a></h1> |
| <h2><a name="5_1">5.1 string::iterator is not char*; |
| vector<T>::iterator is not T*</a></h2> |
| <p>If you have code that depends on container<T> iterators |
| being implemented as pointer-to-T, your code is broken. |
| </p> |
| <p>While there are arguments for iterators to be implemented in |
| that manner, A) they aren't very good ones in the long term, |
| and B) they were never guaranteed by the Standard anyway. The |
| type-safety achieved by making iterators a real class rather |
| than a typedef for <code>T*</code> outweighs nearly all opposing |
| arguments. |
| </p> |
| <p>Code which does assume that a vector iterator <code> i </code> |
| is a pointer can often be fixed by changing <code> i </code> in |
| certain expressions to <code> &*i </code>. Future revisions |
| of the Standard are expected to bless this usage for |
| vector<> (but not for basic_string<>). |
| </p> |
| |
| <hr> |
| <h2><a name="5_2">5.2 What's next after libstdc++-v3?</a></h2> |
| <p>Hopefully, not much. The goal of libstdc++-v3 is to produce |
| a fully-compliant, fully-portable Standard Library. After that, |
| we're mostly done: there won't <em>be</em> any more compliance |
| work to do. However: |
| </p> |
| <ol> |
| <li><p>The ISO Committee will meet periodically to review Defect Reports |
| in the C++ Standard. Undoubtedly some of these will result in |
| changes to the Standard, which will be reflected in patches to |
| libstdc++. Some of that is already happening, see 4.2. Some of |
| those changes are being predicted by the library maintainers, and |
| we add code to the library based on what the current proposed |
| resolution specifies. Those additions are listed in |
| <a href="../ext/howto.html#5">the extensions page</a>. |
| </p> |
| <li><p>Performance tuning. Lots of performance tuning. This too is |
| already underway for post-3.0 releases, starting with memory |
| expansion in container classes and buffer usage in synchronized |
| stream objects. |
| </p> |
| <li><p>An ABI for libstdc++ will eventually be developed, so that |
| multiple binary-incompatible copies of the library can be replaced |
| with a single backwards-compatible library, like libgcc_s.so is. |
| </p> |
| <li><p>The current libstdc++ contains extensions to the Library which |
| must be explicitly requested by client code (for example, the |
| hash tables from SGI). Other extensions may be added to |
| libstdc++-v3 if they seem to be "standard" enough. |
| (For example, the "long long" type from C99.) |
| Bugfixes and rewrites (to improve or fix thread safety, for |
| instance) will of course be a continuing task. |
| </p> |
| </ol> |
| <p><a href="http://gcc.gnu.org/ml/libstdc++/1999/msg00080.html">This |
| question</a> about the next libstdc++ prompted some brief but |
| interesting |
| <a href="http://gcc.gnu.org/ml/libstdc++/1999/msg00084.html">speculation</a>. |
| </p> |
| |
| <hr> |
| <h2><a name="5_3">5.3 What about the STL from SGI?</a></h2> |
| <p>The <a href="http://www.sgi.com/Technology/STL/">STL from SGI</a>, |
| version 3.3, was the most recent merge of the STL codebase. The |
| code in libstdc++ contains many fixes and changes, and it is |
| very likely that the SGI code is no longer under active |
| development. We expect that no future merges will take place. |
| </p> |
| <p>In particular, <code>string</code> is not from SGI and makes no |
| use of their "rope" class (which is included as an |
| optional extension), nor is <code>valarray</code> and some others. |
| Classes like <code>vector<></code> are, however. |
| </p> |
| <p>The FAQ for SGI's STL (one jump off of their main page) is |
| recommended reading. |
| </p> |
| |
| <hr> |
| <h2><a name="5_4">5.4 Extensions and Backward Compatibility</a></h2> |
| <p>Although you can specify <code>-I</code> options to make the |
| preprocessor search the g++-v3/ext and /backward directories, |
| it is better to refer to files there by their path, as in: |
| <!-- Careful, the leading spaces in PRE show up directly. --> |
| </p> |
| <pre> |
| #include <ext/hash_map> |
| </pre> |
| <p>Extensions to the library have |
| <a href="../ext/howto.html">their own page</a>. |
| </p> |
| |
| <hr> |
| <h2><a name="5_5">5.5 [removed]</a></h2> |
| <p>This question has become moot and has been removed. The stub |
| is here to preserve numbering (and hence links/bookmarks). |
| </p> |
| |
| <hr> |
| <h2><a name="5_6">5.6 Is libstdc++-v3 thread-safe?</a></h2> |
| <p>When the system's libc is itself thread-safe, a non-generic |
| implementation of atomicity.h exists for the architecture, and gcc |
| itself reports a thread model other than single; libstdc++-v3 |
| strives to be thread-safe. The user-code must guard against |
| concurrent method calls which may access any particular library |
| object's state. Typically, the application programmer may infer |
| what object locks must be held based on the objects referenced in |
| a method call. Without getting into great detail, here is an |
| example which requires user-level locks: |
| <pre> |
| library_class_a shared_object_a; |
| |
| thread_main () { |
| library_class_b *object_b = new library_class_b; |
| shared_object_a.add_b (object_b); // must hold lock for shared_object_a |
| shared_object_a.mutate (); // must hold lock for shared_object_a |
| } |
| |
| // Multiple copies of thread_main() are started in independent threads.</pre> |
| </p> |
| <p>Under the assumption that object_a and object_b are never exposed to |
| another thread, here is an example that should not require any |
| user-level locks: |
| <pre> |
| thread_main () { |
| library_class_a object_a; |
| library_class_b *object_b = new library_class_b; |
| object_a.add_b (object_b); |
| object_a.mutate (); |
| } </pre> |
| </p> |
| <p>All library objects are safe to use in a multithreaded program as |
| long as each thread carefully locks out access by any other thread |
| while it uses any object visible to another thread. In general, |
| this requirement includes both read and write access to objects; |
| unless otherwise documented as safe, do not assume that two |
| threads may access a shared standard library object at the |
| same time. |
| </p> |
| <p>See chapters <a href="../17_intro/howto.html#3">17</a> (library |
| introduction), <a href="../23_containers/howto.html#3">23</a> |
| (containers), and <a href="../27_io/howto.html#9">27</a> (I/O) for |
| more information. |
| </p> |
| |
| <hr> |
| <h2><a name="5_7">5.7 How do I get a copy of the ISO C++ Standard?</a></h2> |
| <p>Copies of the full ISO 14882 standard are available on line via the |
| ISO mirror site for committee members. Non-members, or those who |
| have not paid for the privilege of sitting on the committee and |
| sustained their two-meeting commitment for voting rights, may get a |
| copy of the standard from their respective national standards |
| organization. In the USA, this national standards organization is |
| ANSI and their website is right <a href="http://www.ansi.org">here</a>. |
| (And if you've already registered with them, clicking this link will |
| take you to directly to the place where you can |
| <a href="http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998">buy |
| the standard on-line</a>. |
| </p> |
| <p>Who is your country's member body? Visit the |
| <a href="http://www.iso.ch/">ISO homepage</a> and find out! |
| </p> |
| |
| <hr> |
| <h2><a name="5_8">5.8 What's an ABI and why is it so messy?</a></h2> |
| <p>"ABI" stands for "Application Binary Interface." |
| Conventionally, it refers to a great mass of details about how |
| arguments are arranged on the call stack and/or in registers, and |
| how various types are arranged and padded in structs. A single CPU |
| design may suffer multiple ABIs designed by different development |
| tool vendors who made different choices, or even by the same vendor |
| for different target applications or compiler versions. In ideal |
| circumstances the CPU designer presents one ABI and all the OSes and |
| compilers use it. In practice every ABI omits details that compiler |
| implementers (consciously or accidentally) must choose for themselves. |
| </p> |
| <p>That ABI definition suffices for compilers to generate code so a |
| program can interact safely with an OS and its lowest-level libraries. |
| Users usually want an ABI to encompass more detail, allowing libraries |
| built with different compilers (or different releases of the same |
| compiler!) to be linked together. For C++, this includes many more |
| details than for C, and CPU designers (for good reasons elaborated |
| below) have not stepped up to publish C++ ABIs. The details include |
| virtual function implementation, struct inheritance layout, name |
| mangling, and exception handling. Such an ABI has been defined for |
| GNU C++, and is immediately useful for embedded work relying only on |
| a "free-standing implementation" that doesn't include (much |
| of) the standard library. It is a good basis for the work to come. |
| </p> |
| <p>A useful C++ ABI must also incorporate many details of the standard |
| library implementation. For a C ABI, the layouts of a few structs |
| (such as FILE, stat, jmpbuf, and the like) and a few macros suffice. |
| For C++, the details include the complete set of names of functions |
| and types used, the offsets of class members and virtual functions, |
| and the actual definitions of all inlines. C++ exposes many more |
| library details to the caller than C does. It makes defining |
| a complete ABI a much bigger undertaking, and requires not just |
| documenting library implementation details, but carefully designing |
| those details so that future bug fixes and optimizations don't |
| force breaking the ABI. |
| </p> |
| <p>There are ways to help isolate library implementation details from the |
| ABI, but they trade off against speed. Library details used in |
| inner loops (e.g., getchar) must be exposed and frozen for all |
| time, but many others may reasonably be kept hidden from user code, |
| so they may later be changed. Deciding which, and implementing |
| the decisions, must happen before you can reasonably document a |
| candidate C++ ABI that encompasses the standard library. |
| </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> |
| |