1<section xmlns="http://docbook.org/ns/docbook" version="5.0" 2 xml:id="manual.appendix.porting.backwards" xreflabel="backwards"> 3<?dbhtml filename="backwards.html"?> 4 5<info><title>Backwards Compatibility</title> 6 <keywordset> 7 <keyword>ISO C++</keyword> 8 <keyword>backwards</keyword> 9 </keywordset> 10</info> 11 12 13 14<section xml:id="backwards.first"><info><title>First</title></info> 15 16 17<para>The first generation GNU C++ library was called libg++. It was a 18separate GNU project, although reliably paired with GCC. Rumors imply 19that it had a working relationship with at least two kinds of 20dinosaur. 21</para> 22 23<para>Some background: libg++ was designed and created when there was no 24ISO standard to provide guidance. Classes like linked lists are now 25provided for by <classname>list<T></classname> and do not need to be 26created by <function>genclass</function>. (For that matter, templates exist 27now and are well-supported, whereas genclass (mostly) predates them.) 28</para> 29 30<para>There are other classes in libg++ that are not specified in the 31ISO Standard (e.g., statistical analysis). While there are a lot of 32really useful things that are used by a lot of people, the Standards 33Committee couldn't include everything, and so a lot of those 34<quote>obvious</quote> classes didn't get included. 35</para> 36 37<para>Known Issues include many of the limitations of its immediate ancestor.</para> 38 39<para>Portability notes and known implementation limitations are as follows.</para> 40 41<section xml:id="backwards.first.ios_base"><info><title>No <code>ios_base</code></title></info> 42 43 44<para> At least some older implementations don't have <code>std::ios_base</code>, so you should use <code>std::ios::badbit</code>, <code>std::ios::failbit</code> and <code>std::ios::eofbit</code> and <code>std::ios::goodbit</code>. 45</para> 46</section> 47 48<section xml:id="backwards.first.cout_cin"><info><title>No <code>cout</code> in <filename class="headerfile"><ostream.h></filename>, no <code>cin</code> in <filename class="headerfile"><istream.h></filename></title></info> 49 50 51<para> 52 In earlier versions of the standard, 53 <filename class="headerfile"><fstream.h></filename>, 54 <filename class="headerfile"><ostream.h></filename> 55 and <filename class="headerfile"><istream.h></filename> 56 used to define 57 <code>cout</code>, <code>cin</code> and so on. ISO C++ specifies that one needs to include 58 <filename class="headerfile"><iostream></filename> 59 explicitly to get the required definitions. 60 </para> 61<para> Some include adjustment may be required.</para> 62 63<para>This project is no longer maintained or supported, and the sources 64archived. For the desperate, 65the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/extensions.html">GCC extensions 66page</link> describes where to find the last libg++ source. The code is 67considered replaced and rewritten. 68</para> 69</section> 70</section> 71 72<section xml:id="backwards.second"><info><title>Second</title></info> 73 74 75<para> 76 The second generation GNU C++ library was called libstdc++, or 77 libstdc++-v2. It spans the time between libg++ and pre-ISO C++ 78 standardization and is usually associated with the following GCC 79 releases: egcs 1.x, gcc 2.95, and gcc 2.96. 80</para> 81 82<para> 83 The STL portions of this library are based on SGI/HP STL release 3.11. 84</para> 85 86<para> 87 This project is no longer maintained or supported, and the sources 88 archived. The code is considered replaced and rewritten. 89</para> 90 91<para> 92 Portability notes and known implementation limitations are as follows. 93</para> 94 95<section xml:id="backwards.second.std"><info><title>Namespace <code>std::</code> not supported</title></info> 96 97 98 <para> 99 Some care is required to support C++ compiler and or library 100 implementation that do not have the standard library in 101 <code>namespace std</code>. 102 </para> 103 104 <para> 105 The following sections list some possible solutions to support compilers 106 that cannot ignore <code>std::</code>-qualified names. 107 </para> 108 109 <para> 110 First, see if the compiler has a flag for this. Namespace 111 back-portability-issues are generally not a problem for g++ 112 compilers that do not have libstdc++ in <code>std::</code>, as the 113 compilers use <option>-fno-honor-std</option> (ignore 114 <code>std::</code>, <code>:: = std::</code>) by default. That is, 115 the responsibility for enabling or disabling <code>std::</code> is 116 on the user; the maintainer does not have to care about it. This 117 probably applies to some other compilers as well. 118 </para> 119 120 <para> 121 Second, experiment with a variety of pre-processor tricks. 122 </para> 123 124 <para> 125 By defining <code>std</code> as a macro, fully-qualified namespace 126 calls become global. Volia. 127 </para> 128 129<programlisting> 130#ifdef WICKEDLY_OLD_COMPILER 131# define std 132#endif 133</programlisting> 134 135 <para> 136 Thanks to Juergen Heinzl who posted this solution on gnu.gcc.help. 137 </para> 138 139 <para> 140 Another pre-processor based approach is to define a macro 141 <code>NAMESPACE_STD</code>, which is defined to either 142 <quote> </quote> or <quote>std</quote> based on a compile-type 143 test. On GNU systems, this can be done with autotools by means of 144 an autoconf test (see below) for <code>HAVE_NAMESPACE_STD</code>, 145 then using that to set a value for the <code>NAMESPACE_STD</code> 146 macro. At that point, one is able to use 147 <code>NAMESPACE_STD::string</code>, which will evaluate to 148 <code>std::string</code> or <code>::string</code> (i.e., in the 149 global namespace on systems that do not put <code>string</code> in 150 <code>std::</code>). 151 </para> 152 153<programlisting> 154dnl @synopsis AC_CXX_NAMESPACE_STD 155dnl 156dnl If the compiler supports namespace std, define 157dnl HAVE_NAMESPACE_STD. 158dnl 159dnl @category Cxx 160dnl @author Todd Veldhuizen 161dnl @author Luc Maisonobe <luc@spaceroots.org> 162dnl @version 2004-02-04 163dnl @license AllPermissive 164AC_DEFUN([AC_CXX_NAMESPACE_STD], [ 165 AC_CACHE_CHECK(if g++ supports namespace std, 166 ac_cv_cxx_have_std_namespace, 167 [AC_LANG_SAVE 168 AC_LANG_CPLUSPLUS 169 AC_TRY_COMPILE([#include <iostream> 170 std::istream& is = std::cin;],, 171 ac_cv_cxx_have_std_namespace=yes, ac_cv_cxx_have_std_namespace=no) 172 AC_LANG_RESTORE 173 ]) 174 if test "$ac_cv_cxx_have_std_namespace" = yes; then 175 AC_DEFINE(HAVE_NAMESPACE_STD,,[Define if g++ supports namespace std. ]) 176 fi 177]) 178</programlisting> 179</section> 180 181<section xml:id="backwards.second.iterators"><info><title>Illegal iterator usage</title></info> 182 183<para> 184 The following illustrate implementation-allowed illegal iterator 185 use, and then correct use. 186</para> 187 188<itemizedlist> 189 <listitem> 190 <para> 191 you cannot do <code>ostream::operator<<(iterator)</code> 192 to print the address of the iterator => use 193 <code>operator<< &*iterator</code> instead 194 </para> 195 </listitem> 196 <listitem> 197 <para> 198 you cannot clear an iterator's reference (<code>iterator = 199 0</code>) => use <code>iterator = iterator_type();</code> 200 </para> 201 </listitem> 202 <listitem> 203 <para> 204 <code>if (iterator)</code> won't work any more => use 205 <code>if (iterator != iterator_type())</code> 206 </para> 207 </listitem> 208</itemizedlist> 209</section> 210 211<section xml:id="backwards.second.isspace"><info><title><code>isspace</code> from <filename class="headerfile"><cctype></filename> is a macro 212 </title></info> 213 214 215 <para> 216 Glibc 2.0.x and 2.1.x define <filename class="headerfile"><ctype.h></filename> functionality as macros 217 (isspace, isalpha etc.). 218 </para> 219 220 <para> 221 This implementations of libstdc++, however, keep these functions 222 as macros, and so it is not back-portable to use fully qualified 223 names. For example: 224 </para> 225 226<programlisting> 227#include <cctype> 228int main() { std::isspace('X'); } 229</programlisting> 230 231<para> 232 Results in something like this: 233</para> 234 235<programlisting> 236std:: (__ctype_b[(int) ( ( 'X' ) )] & (unsigned short int) _ISspace ) ; 237</programlisting> 238 239<para> 240 A solution is to modify a header-file so that the compiler tells 241 <filename class="headerfile"><ctype.h></filename> to define functions 242 instead of macros: 243</para> 244 245<programlisting> 246// This keeps isalnum, et al from being propagated as macros. 247#if __linux__ 248# define __NO_CTYPE 1 249#endif 250</programlisting> 251 252<para> 253 Then, include <filename class="headerfile"><ctype.h></filename> 254</para> 255 256<para> 257 Another problem arises if you put a <code>using namespace 258 std;</code> declaration at the top, and include 259 <filename class="headerfile"><ctype.h></filename>. This will 260 result in ambiguities between the definitions in the global namespace 261 (<filename class="headerfile"><ctype.h></filename>) and the 262 definitions in namespace <code>std::</code> 263 (<code><cctype></code>). 264</para> 265</section> 266 267<section xml:id="backwards.second.at"><info><title>No <code>vector::at</code>, <code>deque::at</code>, <code>string::at</code></title></info> 268 269 270<para> 271 One solution is to add an autoconf-test for this: 272</para> 273 274<programlisting> 275AC_MSG_CHECKING(for container::at) 276AC_TRY_COMPILE( 277[ 278#include <vector> 279#include <deque> 280#include <string> 281 282using namespace std; 283], 284[ 285deque<int> test_deque(3); 286test_deque.at(2); 287vector<int> test_vector(2); 288test_vector.at(1); 289string test_string(<quote>test_string</quote>); 290test_string.at(3); 291], 292[AC_MSG_RESULT(yes) 293AC_DEFINE(HAVE_CONTAINER_AT)], 294[AC_MSG_RESULT(no)]) 295</programlisting> 296 297<para> 298 If you are using other (non-GNU) compilers it might be a good idea 299 to check for <code>string::at</code> separately. 300</para> 301 302</section> 303 304<section xml:id="backwards.second.eof"><info><title>No <code>std::char_traits<char>::eof</code></title></info> 305 306 307<para> 308 Use some kind of autoconf test, plus this: 309</para> 310 311<programlisting> 312#ifdef HAVE_CHAR_TRAITS 313#define CPP_EOF std::char_traits<char>::eof() 314#else 315#define CPP_EOF EOF 316#endif 317</programlisting> 318 319</section> 320 321<section xml:id="backwards.second.stringclear"><info><title>No <code>string::clear</code></title></info> 322 323 324<para> 325 There are two functions for deleting the contents of a string: 326 <code>clear</code> and <code>erase</code> (the latter returns the 327 string). 328</para> 329 330<programlisting> 331void 332clear() { _M_mutate(0, this->size(), 0); } 333</programlisting> 334 335<programlisting> 336basic_string& 337erase(size_type __pos = 0, size_type __n = npos) 338{ 339 return this->replace(_M_check(__pos), _M_fold(__pos, __n), 340 _M_data(), _M_data()); 341} 342</programlisting> 343 344<para> 345 Unfortunately, <code>clear</code> is not implemented in this 346 version, so you should use <code>erase</code> (which is probably 347 faster than <code>operator=(charT*)</code>). 348</para> 349</section> 350 351<section xml:id="backwards.second.ostreamform_istreamscan"><info><title> 352 Removal of <code>ostream::form</code> and <code>istream::scan</code> 353 extensions 354</title></info> 355 356 357<para> 358 These are no longer supported. Please use stringstreams instead. 359</para> 360</section> 361 362<section xml:id="backwards.second.stringstreams"><info><title>No <code>basic_stringbuf</code>, <code>basic_stringstream</code></title></info> 363 364 365<para> 366 Although the ISO standard <code>i/ostringstream</code>-classes are 367 provided, (<filename class="headerfile"><sstream></filename>), for 368 compatibility with older implementations the pre-ISO 369 <code>i/ostrstream</code> (<filename class="headerfile"><strstream></filename>) interface is also provided, 370 with these caveats: 371</para> 372 373<itemizedlist> 374 <listitem> 375 <para> 376 <code>strstream</code> is considered to be deprecated 377 </para> 378 </listitem> 379 <listitem> 380 <para> 381 <code>strstream</code> is limited to <code>char</code> 382 </para> 383 </listitem> 384 <listitem> 385 <para> 386 with <code>ostringstream</code> you don't have to take care of 387 terminating the string or freeing its memory 388 </para> 389 </listitem> 390 <listitem> 391 <para> 392 <code>istringstream</code> can be re-filled (clear(); 393 str(input);) 394 </para> 395 </listitem> 396</itemizedlist> 397 398<para> 399 You can then use output-stringstreams like this: 400</para> 401 402<programlisting> 403#ifdef HAVE_SSTREAM 404# include <sstream> 405#else 406# include <strstream> 407#endif 408 409#ifdef HAVE_SSTREAM 410 std::ostringstream oss; 411#else 412 std::ostrstream oss; 413#endif 414 415oss << <quote>Name=</quote> << m_name << <quote>, number=</quote> << m_number << std::endl; 416... 417#ifndef HAVE_SSTREAM 418 oss << std::ends; // terminate the char*-string 419#endif 420 421// str() returns char* for ostrstream and a string for ostringstream 422// this also causes ostrstream to think that the buffer's memory 423// is yours 424m_label.set_text(oss.str()); 425#ifndef HAVE_SSTREAM 426 // let the ostrstream take care of freeing the memory 427 oss.freeze(false); 428#endif 429</programlisting> 430 431<para> 432 Input-stringstreams can be used similarly: 433</para> 434 435<programlisting> 436std::string input; 437... 438#ifdef HAVE_SSTREAM 439std::istringstream iss(input); 440#else 441std::istrstream iss(input.c_str()); 442#endif 443 444int i; 445iss >> i; 446</programlisting> 447 448<para> One (the only?) restriction is that an istrstream cannot be re-filled: 449</para> 450 451<programlisting> 452std::istringstream iss(numerator); 453iss >> m_num; 454// this is not possible with istrstream 455iss.clear(); 456iss.str(denominator); 457iss >> m_den; 458</programlisting> 459 460<para> 461If you don't care about speed, you can put these conversions in 462 a template-function: 463</para> 464<programlisting> 465template <class X> 466void fromString(const string& input, X& any) 467{ 468#ifdef HAVE_SSTREAM 469std::istringstream iss(input); 470#else 471std::istrstream iss(input.c_str()); 472#endif 473X temp; 474iss >> temp; 475if (iss.fail()) 476throw runtime_error(..) 477any = temp; 478} 479</programlisting> 480 481<para> 482 Another example of using stringstreams is in <link linkend="strings.string.shrink">this howto</link>. 483</para> 484 485<para> There is additional information in the libstdc++-v2 info files, in 486particular <quote>info iostream</quote>. 487</para> 488</section> 489 490<section xml:id="backwards.second.wchar"><info><title>Little or no wide character support</title></info> 491 492 <para> 493 Classes <classname>wstring</classname> and 494 <classname>char_traits<wchar_t></classname> are 495 not supported. 496 </para> 497</section> 498 499<section xml:id="backwards.second.iostream_templates"><info><title>No templatized iostreams</title></info> 500 501 <para> 502 Classes <classname>wfilebuf</classname> and 503 <classname>wstringstream</classname> are not supported. 504 </para> 505</section> 506 507<section xml:id="backwards.second.thread_safety"><info><title>Thread safety issues</title></info> 508 509 510 <para> 511 Earlier GCC releases had a somewhat different approach to 512 threading configuration and proper compilation. Before GCC 3.0, 513 configuration of the threading model was dictated by compiler 514 command-line options and macros (both of which were somewhat 515 thread-implementation and port-specific). There were no 516 guarantees related to being able to link code compiled with one 517 set of options and macro setting with another set. 518 </para> 519 520 <para> 521 For GCC 3.0, configuration of the threading model used with 522 libraries and user-code is performed when GCC is configured and 523 built using the --enable-threads and --disable-threads options. 524 The ABI is stable for symbol name-mangling and limited functional 525 compatibility exists between code compiled under different 526 threading models. 527 </para> 528 529 <para> 530 The libstdc++ library has been designed so that it can be used in 531 multithreaded applications (with libstdc++-v2 this was only true 532 of the STL parts.) The first problem is finding a 533 <emphasis>fast</emphasis> method of implementation portable to 534 all platforms. Due to historical reasons, some of the library is 535 written against per-CPU-architecture spinlocks and other parts 536 against the gthr.h abstraction layer which is provided by gcc. A 537 minor problem that pops up every so often is different 538 interpretations of what "thread-safe" means for a 539 library (not a general program). We currently use the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.sgi.com/tech/stl/thread_safety.html">same 540 definition that SGI</link> uses for their STL subset. However, 541 the exception for read-only containers only applies to the STL 542 components. This definition is widely-used and something similar 543 will be used in the next version of the C++ standard library. 544 </para> 545 546 <para> 547 Here is a small link farm to threads (no pun) in the mail 548 archives that discuss the threading problem. Each link is to the 549 first relevant message in the thread; from there you can use 550 "Thread Next" to move down the thread. This farm is in 551 latest-to-oldest order. 552 </para> 553 554 <itemizedlist> 555 <listitem> 556 <para> 557 Our threading expert Loren gives a breakdown of <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2001-10/msg00024.html">the 558 six situations involving threads</link> for the 3.0 559 release series. 560 </para> 561 </listitem> 562 <listitem> 563 <para> 564 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2001-05/msg00384.html"> 565 This message</link> inspired a recent updating of issues with 566 threading and the SGI STL library. It also contains some 567 example POSIX-multithreaded STL code. 568 </para> 569 </listitem> 570 </itemizedlist> 571 572 <para> 573 (A large selection of links to older messages has been removed; 574 many of the messages from 1999 were lost in a disk crash, and the 575 few people with access to the backup tapes have been too swamped 576 with work to restore them. Many of the points have been 577 superseded anyhow.) 578 </para> 579</section> 580 581</section> 582 583<section xml:id="backwards.third"><info><title>Third</title></info> 584 585 586<para> The third generation GNU C++ library is called libstdc++, or 587libstdc++-v3. 588</para> 589 590 <para>The subset commonly known as the Standard Template Library 591 (chapters 23 through 25, mostly) is adapted from the final release 592 of the SGI STL (version 3.3), with extensive changes. 593 </para> 594 595 <para>A more formal description of the V3 goals can be found in the 596 official <link linkend="contrib.design_notes">design document</link>. 597 </para> 598 599<para>Portability notes and known implementation limitations are as follows.</para> 600 601<section xml:id="backwards.third.headers"><info><title>Pre-ISO headers moved to backwards or removed</title></info> 602 603 604<para> The pre-ISO C++ headers 605 (<filename class="headerfile"><iostream.h></filename>, 606 <filename class="headerfile"><defalloc.h></filename> etc.) are 607 available, unlike previous libstdc++ versions, but inclusion 608 generates a warning that you are using deprecated headers. 609</para> 610 611 <para>This compatibility layer is constructed by including the 612 standard C++ headers, and injecting any items in 613 <code>std::</code> into the global namespace. 614 </para> 615 <para>For those of you new to ISO C++ (welcome, time travelers!), no, 616 that isn't a typo. Yes, the headers really have new names. 617 Marshall Cline's C++ FAQ Lite has a good explanation in <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.4">item 618 [27.4]</link>. 619 </para> 620 621<para> Some include adjustment may be required. What follows is an 622autoconf test that defines <code>PRE_STDCXX_HEADERS</code> when they 623exist.</para> 624 625<programlisting> 626# AC_HEADER_PRE_STDCXX 627AC_DEFUN([AC_HEADER_PRE_STDCXX], [ 628 AC_CACHE_CHECK(for pre-ISO C++ include files, 629 ac_cv_cxx_pre_stdcxx, 630 [AC_LANG_SAVE 631 AC_LANG_CPLUSPLUS 632 ac_save_CXXFLAGS="$CXXFLAGS" 633 CXXFLAGS="$CXXFLAGS -Wno-deprecated" 634 635 # Omit defalloc.h, as compilation with newer compilers is problematic. 636 AC_TRY_COMPILE([ 637 #include <new.h> 638 #include <iterator.h> 639 #include <alloc.h> 640 #include <set.h> 641 #include <hashtable.h> 642 #include <hash_set.h> 643 #include <fstream.h> 644 #include <tempbuf.h> 645 #include <istream.h> 646 #include <bvector.h> 647 #include <stack.h> 648 #include <rope.h> 649 #include <complex.h> 650 #include <ostream.h> 651 #include <heap.h> 652 #include <iostream.h> 653 #include <function.h> 654 #include <multimap.h> 655 #include <pair.h> 656 #include <stream.h> 657 #include <iomanip.h> 658 #include <slist.h> 659 #include <tree.h> 660 #include <vector.h> 661 #include <deque.h> 662 #include <multiset.h> 663 #include <list.h> 664 #include <map.h> 665 #include <algobase.h> 666 #include <hash_map.h> 667 #include <algo.h> 668 #include <queue.h> 669 #include <streambuf.h> 670 ],, 671 ac_cv_cxx_pre_stdcxx=yes, ac_cv_cxx_pre_stdcxx=no) 672 CXXFLAGS="$ac_save_CXXFLAGS" 673 AC_LANG_RESTORE 674 ]) 675 if test "$ac_cv_cxx_pre_stdcxx" = yes; then 676 AC_DEFINE(PRE_STDCXX_HEADERS,,[Define if pre-ISO C++ header files are present. ]) 677 fi 678]) 679</programlisting> 680 681<para>Porting between pre-ISO headers and ISO headers is simple: headers 682like <filename class="headerfile"><vector.h></filename> can be replaced with <filename class="headerfile"><vector></filename> and a using 683directive <code>using namespace std;</code> can be put at the global 684scope. This should be enough to get this code compiling, assuming the 685other usage is correct. 686</para> 687</section> 688 689<section xml:id="backwards.third.hash"><info><title>Extension headers hash_map, hash_set moved to ext or backwards</title></info> 690 691 692 <para>At this time most of the features of the SGI STL extension have been 693 replaced by standardized libraries. 694 In particular, the <classname>unordered_map</classname> and 695 <classname>unordered_set</classname> containers of TR1 and C++ 2011 696 are suitable replacements for the non-standard 697 <classname>hash_map</classname> and <classname>hash_set</classname> 698 containers in the SGI STL. 699 </para> 700<para> Header files <filename class="headerfile"><hash_map></filename> and <filename class="headerfile"><hash_set></filename> moved 701to <filename class="headerfile"><ext/hash_map></filename> and <filename class="headerfile"><ext/hash_set></filename>, 702respectively. At the same time, all types in these files are enclosed 703in <code>namespace __gnu_cxx</code>. Later versions deprecate 704these files, and suggest using TR1's <filename class="headerfile"><unordered_map></filename> 705and <filename class="headerfile"><unordered_set></filename> instead. 706</para> 707 708 <para>The extensions are no longer in the global or <code>std</code> 709 namespaces, instead they are declared in the <code>__gnu_cxx</code> 710 namespace. For maximum portability, consider defining a namespace 711 alias to use to talk about extensions, e.g.: 712 </para> 713 <programlisting> 714 #ifdef __GNUC__ 715 #if __GNUC__ < 3 716 #include <hash_map.h> 717 namespace extension { using ::hash_map; }; // inherit globals 718 #else 719 #include <backward/hash_map> 720 #if __GNUC__ == 3 && __GNUC_MINOR__ == 0 721 namespace extension = std; // GCC 3.0 722 #else 723 namespace extension = ::__gnu_cxx; // GCC 3.1 and later 724 #endif 725 #endif 726 #else // ... there are other compilers, right? 727 namespace extension = std; 728 #endif 729 730 extension::hash_map<int,int> my_map; 731 </programlisting> 732 <para>This is a bit cleaner than defining typedefs for all the 733 instantiations you might need. 734 </para> 735 736 737<para>The following autoconf tests check for working HP/SGI hash containers. 738</para> 739 740<programlisting> 741# AC_HEADER_EXT_HASH_MAP 742AC_DEFUN([AC_HEADER_EXT_HASH_MAP], [ 743 AC_CACHE_CHECK(for ext/hash_map, 744 ac_cv_cxx_ext_hash_map, 745 [AC_LANG_SAVE 746 AC_LANG_CPLUSPLUS 747 ac_save_CXXFLAGS="$CXXFLAGS" 748 CXXFLAGS="$CXXFLAGS -Werror" 749 AC_TRY_COMPILE([#include <ext/hash_map>], [using __gnu_cxx::hash_map;], 750 ac_cv_cxx_ext_hash_map=yes, ac_cv_cxx_ext_hash_map=no) 751 CXXFLAGS="$ac_save_CXXFLAGS" 752 AC_LANG_RESTORE 753 ]) 754 if test "$ac_cv_cxx_ext_hash_map" = yes; then 755 AC_DEFINE(HAVE_EXT_HASH_MAP,,[Define if ext/hash_map is present. ]) 756 fi 757]) 758</programlisting> 759 760<programlisting> 761# AC_HEADER_EXT_HASH_SET 762AC_DEFUN([AC_HEADER_EXT_HASH_SET], [ 763 AC_CACHE_CHECK(for ext/hash_set, 764 ac_cv_cxx_ext_hash_set, 765 [AC_LANG_SAVE 766 AC_LANG_CPLUSPLUS 767 ac_save_CXXFLAGS="$CXXFLAGS" 768 CXXFLAGS="$CXXFLAGS -Werror" 769 AC_TRY_COMPILE([#include <ext/hash_set>], [using __gnu_cxx::hash_set;], 770 ac_cv_cxx_ext_hash_set=yes, ac_cv_cxx_ext_hash_set=no) 771 CXXFLAGS="$ac_save_CXXFLAGS" 772 AC_LANG_RESTORE 773 ]) 774 if test "$ac_cv_cxx_ext_hash_set" = yes; then 775 AC_DEFINE(HAVE_EXT_HASH_SET,,[Define if ext/hash_set is present. ]) 776 fi 777]) 778</programlisting> 779</section> 780 781<section xml:id="backwards.third.nocreate_noreplace"><info><title>No <code>ios::nocreate/ios::noreplace</code>. 782</title></info> 783 784 785<para> The existence of <code>ios::nocreate</code> being used for 786input-streams has been confirmed, most probably because the author 787thought it would be more correct to specify nocreate explicitly. So 788it can be left out for input-streams. 789</para> 790 791<para>For output streams, <quote>nocreate</quote> is probably the default, 792unless you specify <code>std::ios::trunc</code> ? To be safe, you can 793open the file for reading, check if it has been opened, and then 794decide whether you want to create/replace or not. To my knowledge, 795even older implementations support <code>app</code>, <code>ate</code> 796and <code>trunc</code> (except for <code>app</code> ?). 797</para> 798</section> 799 800<section xml:id="backwards.third.streamattach"><info><title> 801No <code>stream::attach(int fd)</code> 802</title></info> 803 804 805<para> 806 Phil Edwards writes: It was considered and rejected for the ISO 807 standard. Not all environments use file descriptors. Of those 808 that do, not all of them use integers to represent them. 809 </para> 810 811<para> 812 For a portable solution (among systems which use 813 file descriptors), you need to implement a subclass of 814 <code>std::streambuf</code> (or 815 <code>std::basic_streambuf<..></code>) which opens a file 816 given a descriptor, and then pass an instance of this to the 817 stream-constructor. 818 </para> 819 820<para> 821 An extension is available that implements this. 822 <filename class="headerfile"><ext/stdio_filebuf.h></filename> contains a derived class called 823 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00074.html"><code>__gnu_cxx::stdio_filebuf</code></link>. 824 This class can be constructed from a C <code>FILE*</code> or a file 825 descriptor, and provides the <code>fd()</code> function. 826 </para> 827 828<para> 829 For another example of this, refer to 830 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.josuttis.com/cppcode/fdstream.html">fdstream example</link> 831 by Nicolai Josuttis. 832</para> 833</section> 834 835<section xml:id="backwards.third.support_cxx98"><info><title> 836Support for C++98 dialect. 837</title></info> 838 839 840<para>Check for complete library coverage of the C++1998/2003 standard. 841</para> 842 843<programlisting> 844# AC_HEADER_STDCXX_98 845AC_DEFUN([AC_HEADER_STDCXX_98], [ 846 AC_CACHE_CHECK(for ISO C++ 98 include files, 847 ac_cv_cxx_stdcxx_98, 848 [AC_LANG_SAVE 849 AC_LANG_CPLUSPLUS 850 AC_TRY_COMPILE([ 851 #include <cassert> 852 #include <cctype> 853 #include <cerrno> 854 #include <cfloat> 855 #include <ciso646> 856 #include <climits> 857 #include <clocale> 858 #include <cmath> 859 #include <csetjmp> 860 #include <csignal> 861 #include <cstdarg> 862 #include <cstddef> 863 #include <cstdio> 864 #include <cstdlib> 865 #include <cstring> 866 #include <ctime> 867 868 #include <algorithm> 869 #include <bitset> 870 #include <complex> 871 #include <deque> 872 #include <exception> 873 #include <fstream> 874 #include <functional> 875 #include <iomanip> 876 #include <ios> 877 #include <iosfwd> 878 #include <iostream> 879 #include <istream> 880 #include <iterator> 881 #include <limits> 882 #include <list> 883 #include <locale> 884 #include <map> 885 #include <memory> 886 #include <new> 887 #include <numeric> 888 #include <ostream> 889 #include <queue> 890 #include <set> 891 #include <sstream> 892 #include <stack> 893 #include <stdexcept> 894 #include <streambuf> 895 #include <string> 896 #include <typeinfo> 897 #include <utility> 898 #include <valarray> 899 #include <vector> 900 ],, 901 ac_cv_cxx_stdcxx_98=yes, ac_cv_cxx_stdcxx_98=no) 902 AC_LANG_RESTORE 903 ]) 904 if test "$ac_cv_cxx_stdcxx_98" = yes; then 905 AC_DEFINE(STDCXX_98_HEADERS,,[Define if ISO C++ 1998 header files are present. ]) 906 fi 907]) 908</programlisting> 909</section> 910 911<section xml:id="backwards.third.support_tr1"><info><title> 912Support for C++TR1 dialect. 913</title></info> 914 915 916<para>Check for library coverage of the TR1 standard. 917</para> 918 919<programlisting> 920# AC_HEADER_STDCXX_TR1 921AC_DEFUN([AC_HEADER_STDCXX_TR1], [ 922 AC_CACHE_CHECK(for ISO C++ TR1 include files, 923 ac_cv_cxx_stdcxx_tr1, 924 [AC_LANG_SAVE 925 AC_LANG_CPLUSPLUS 926 AC_TRY_COMPILE([ 927 #include <tr1/array> 928 #include <tr1/ccomplex> 929 #include <tr1/cctype> 930 #include <tr1/cfenv> 931 #include <tr1/cfloat> 932 #include <tr1/cinttypes> 933 #include <tr1/climits> 934 #include <tr1/cmath> 935 #include <tr1/complex> 936 #include <tr1/cstdarg> 937 #include <tr1/cstdbool> 938 #include <tr1/cstdint> 939 #include <tr1/cstdio> 940 #include <tr1/cstdlib> 941 #include <tr1/ctgmath> 942 #include <tr1/ctime> 943 #include <tr1/cwchar> 944 #include <tr1/cwctype> 945 #include <tr1/functional> 946 #include <tr1/memory> 947 #include <tr1/random> 948 #include <tr1/regex> 949 #include <tr1/tuple> 950 #include <tr1/type_traits> 951 #include <tr1/unordered_set> 952 #include <tr1/unordered_map> 953 #include <tr1/utility> 954 ],, 955 ac_cv_cxx_stdcxx_tr1=yes, ac_cv_cxx_stdcxx_tr1=no) 956 AC_LANG_RESTORE 957 ]) 958 if test "$ac_cv_cxx_stdcxx_tr1" = yes; then 959 AC_DEFINE(STDCXX_TR1_HEADERS,,[Define if ISO C++ TR1 header files are present. ]) 960 fi 961]) 962</programlisting> 963 964<para>An alternative is to check just for specific TR1 includes, such as <unordered_map> and <unordered_set>. 965</para> 966 967<programlisting> 968# AC_HEADER_TR1_UNORDERED_MAP 969AC_DEFUN([AC_HEADER_TR1_UNORDERED_MAP], [ 970 AC_CACHE_CHECK(for tr1/unordered_map, 971 ac_cv_cxx_tr1_unordered_map, 972 [AC_LANG_SAVE 973 AC_LANG_CPLUSPLUS 974 AC_TRY_COMPILE([#include <tr1/unordered_map>], [using std::tr1::unordered_map;], 975 ac_cv_cxx_tr1_unordered_map=yes, ac_cv_cxx_tr1_unordered_map=no) 976 AC_LANG_RESTORE 977 ]) 978 if test "$ac_cv_cxx_tr1_unordered_map" = yes; then 979 AC_DEFINE(HAVE_TR1_UNORDERED_MAP,,[Define if tr1/unordered_map is present. ]) 980 fi 981]) 982</programlisting> 983 984<programlisting> 985# AC_HEADER_TR1_UNORDERED_SET 986AC_DEFUN([AC_HEADER_TR1_UNORDERED_SET], [ 987 AC_CACHE_CHECK(for tr1/unordered_set, 988 ac_cv_cxx_tr1_unordered_set, 989 [AC_LANG_SAVE 990 AC_LANG_CPLUSPLUS 991 AC_TRY_COMPILE([#include <tr1/unordered_set>], [using std::tr1::unordered_set;], 992 ac_cv_cxx_tr1_unordered_set=yes, ac_cv_cxx_tr1_unordered_set=no) 993 AC_LANG_RESTORE 994 ]) 995 if test "$ac_cv_cxx_tr1_unordered_set" = yes; then 996 AC_DEFINE(HAVE_TR1_UNORDERED_SET,,[Define if tr1/unordered_set is present. ]) 997 fi 998]) 999</programlisting> 1000</section> 1001 1002 1003<section xml:id="backwards.third.support_cxx11"><info><title> 1004Support for C++11 dialect. 1005</title></info> 1006 1007 1008<para>Check for baseline language coverage in the compiler for the C++11 standard. 1009</para> 1010 1011<programlisting> 1012# AC_COMPILE_STDCXX_11 1013AC_DEFUN([AC_COMPILE_STDCXX_11], [ 1014 AC_CACHE_CHECK(if g++ supports C++11 features without additional flags, 1015 ac_cv_cxx_compile_cxx11_native, 1016 [AC_LANG_SAVE 1017 AC_LANG_CPLUSPLUS 1018 AC_TRY_COMPILE([ 1019 template <typename T> 1020 struct check final 1021 { 1022 static constexpr T value{ __cplusplus }; 1023 }; 1024 1025 typedef check<check<bool>> right_angle_brackets; 1026 1027 int a; 1028 decltype(a) b; 1029 1030 typedef check<int> check_type; 1031 check_type c{}; 1032 check_type&& cr = static_cast<check_type&&>(c); 1033 1034 static_assert(check_type::value == 201103L, "C++11 compiler");],, 1035 ac_cv_cxx_compile_cxx11_native=yes, ac_cv_cxx_compile_cxx11_native=no) 1036 AC_LANG_RESTORE 1037 ]) 1038 1039 AC_CACHE_CHECK(if g++ supports C++11 features with -std=c++11, 1040 ac_cv_cxx_compile_cxx11_cxx, 1041 [AC_LANG_SAVE 1042 AC_LANG_CPLUSPLUS 1043 ac_save_CXXFLAGS="$CXXFLAGS" 1044 CXXFLAGS="$CXXFLAGS -std=c++11" 1045 AC_TRY_COMPILE([ 1046 template <typename T> 1047 struct check final 1048 { 1049 static constexpr T value{ __cplusplus }; 1050 }; 1051 1052 typedef check<check<bool>> right_angle_brackets; 1053 1054 int a; 1055 decltype(a) b; 1056 1057 typedef check<int> check_type; 1058 check_type c{}; 1059 check_type&& cr = static_cast<check_type&&>(c); 1060 1061 static_assert(check_type::value == 201103L, "C++11 compiler");],, 1062 ac_cv_cxx_compile_cxx11_cxx=yes, ac_cv_cxx_compile_cxx11_cxx=no) 1063 CXXFLAGS="$ac_save_CXXFLAGS" 1064 AC_LANG_RESTORE 1065 ]) 1066 1067 AC_CACHE_CHECK(if g++ supports C++11 features with -std=gnu++11, 1068 ac_cv_cxx_compile_cxx11_gxx, 1069 [AC_LANG_SAVE 1070 AC_LANG_CPLUSPLUS 1071 ac_save_CXXFLAGS="$CXXFLAGS" 1072 CXXFLAGS="$CXXFLAGS -std=gnu++11" 1073 AC_TRY_COMPILE([ 1074 template <typename T> 1075 struct check final 1076 { 1077 static constexpr T value{ __cplusplus }; 1078 }; 1079 1080 typedef check<check<bool>> right_angle_brackets; 1081 1082 int a; 1083 decltype(a) b; 1084 1085 typedef check<int> check_type; 1086 check_type c{}; 1087 check_type&& cr = static_cast<check_type&&>(c); 1088 1089 static_assert(check_type::value == 201103L, "C++11 compiler");],, 1090 ac_cv_cxx_compile_cxx11_gxx=yes, ac_cv_cxx_compile_cxx11_gxx=no) 1091 CXXFLAGS="$ac_save_CXXFLAGS" 1092 AC_LANG_RESTORE 1093 ]) 1094 1095 if test "$ac_cv_cxx_compile_cxx11_native" = yes || 1096 test "$ac_cv_cxx_compile_cxx11_cxx" = yes || 1097 test "$ac_cv_cxx_compile_cxx11_gxx" = yes; then 1098 AC_DEFINE(HAVE_STDCXX_11,,[Define if g++ supports C++11 features. ]) 1099 fi 1100]) 1101</programlisting> 1102 1103 1104<para>Check for library coverage of the C++2011 standard. 1105 (Some library headers are commented out in this check, they are 1106 not currently provided by libstdc++). 1107</para> 1108 1109<programlisting> 1110# AC_HEADER_STDCXX_11 1111AC_DEFUN([AC_HEADER_STDCXX_11], [ 1112 AC_CACHE_CHECK(for ISO C++11 include files, 1113 ac_cv_cxx_stdcxx_11, 1114 [AC_REQUIRE([AC_COMPILE_STDCXX_11]) 1115 AC_LANG_SAVE 1116 AC_LANG_CPLUSPLUS 1117 ac_save_CXXFLAGS="$CXXFLAGS" 1118 CXXFLAGS="$CXXFLAGS -std=gnu++11" 1119 1120 AC_TRY_COMPILE([ 1121 #include <cassert> 1122 #include <ccomplex> 1123 #include <cctype> 1124 #include <cerrno> 1125 #include <cfenv> 1126 #include <cfloat> 1127 #include <cinttypes> 1128 #include <ciso646> 1129 #include <climits> 1130 #include <clocale> 1131 #include <cmath> 1132 #include <csetjmp> 1133 #include <csignal> 1134 #include <cstdalign> 1135 #include <cstdarg> 1136 #include <cstdbool> 1137 #include <cstddef> 1138 #include <cstdint> 1139 #include <cstdio> 1140 #include <cstdlib> 1141 #include <cstring> 1142 #include <ctgmath> 1143 #include <ctime> 1144 // #include <cuchar> 1145 #include <cwchar> 1146 #include <cwctype> 1147 1148 #include <algorithm> 1149 #include <array> 1150 #include <atomic> 1151 #include <bitset> 1152 #include <chrono> 1153 // #include <codecvt> 1154 #include <complex> 1155 #include <condition_variable> 1156 #include <deque> 1157 #include <exception> 1158 #include <forward_list> 1159 #include <fstream> 1160 #include <functional> 1161 #include <future> 1162 #include <initializer_list> 1163 #include <iomanip> 1164 #include <ios> 1165 #include <iosfwd> 1166 #include <iostream> 1167 #include <istream> 1168 #include <iterator> 1169 #include <limits> 1170 #include <list> 1171 #include <locale> 1172 #include <map> 1173 #include <memory> 1174 #include <mutex> 1175 #include <new> 1176 #include <numeric> 1177 #include <ostream> 1178 #include <queue> 1179 #include <random> 1180 #include <ratio> 1181 #include <regex> 1182 #include <scoped_allocator> 1183 #include <set> 1184 #include <sstream> 1185 #include <stack> 1186 #include <stdexcept> 1187 #include <streambuf> 1188 #include <string> 1189 #include <system_error> 1190 #include <thread> 1191 #include <tuple> 1192 #include <typeindex> 1193 #include <typeinfo> 1194 #include <type_traits> 1195 #include <unordered_map> 1196 #include <unordered_set> 1197 #include <utility> 1198 #include <valarray> 1199 #include <vector> 1200 ],, 1201 ac_cv_cxx_stdcxx_11=yes, ac_cv_cxx_stdcxx_11=no) 1202 AC_LANG_RESTORE 1203 CXXFLAGS="$ac_save_CXXFLAGS" 1204 ]) 1205 if test "$ac_cv_cxx_stdcxx_11" = yes; then 1206 AC_DEFINE(STDCXX_11_HEADERS,,[Define if ISO C++11 header files are present. ]) 1207 fi 1208]) 1209</programlisting> 1210 1211<para>As is the case for TR1 support, these autoconf macros can be made for a finer-grained, per-header-file check. For 1212<filename class="headerfile"><unordered_map></filename> 1213</para> 1214 1215<programlisting> 1216# AC_HEADER_UNORDERED_MAP 1217AC_DEFUN([AC_HEADER_UNORDERED_MAP], [ 1218 AC_CACHE_CHECK(for unordered_map, 1219 ac_cv_cxx_unordered_map, 1220 [AC_REQUIRE([AC_COMPILE_STDCXX_11]) 1221 AC_LANG_SAVE 1222 AC_LANG_CPLUSPLUS 1223 ac_save_CXXFLAGS="$CXXFLAGS" 1224 CXXFLAGS="$CXXFLAGS -std=gnu++11" 1225 AC_TRY_COMPILE([#include <unordered_map>], [using std::unordered_map;], 1226 ac_cv_cxx_unordered_map=yes, ac_cv_cxx_unordered_map=no) 1227 CXXFLAGS="$ac_save_CXXFLAGS" 1228 AC_LANG_RESTORE 1229 ]) 1230 if test "$ac_cv_cxx_unordered_map" = yes; then 1231 AC_DEFINE(HAVE_UNORDERED_MAP,,[Define if unordered_map is present. ]) 1232 fi 1233]) 1234</programlisting> 1235 1236<programlisting> 1237# AC_HEADER_UNORDERED_SET 1238AC_DEFUN([AC_HEADER_UNORDERED_SET], [ 1239 AC_CACHE_CHECK(for unordered_set, 1240 ac_cv_cxx_unordered_set, 1241 [AC_REQUIRE([AC_COMPILE_STDCXX_11]) 1242 AC_LANG_SAVE 1243 AC_LANG_CPLUSPLUS 1244 ac_save_CXXFLAGS="$CXXFLAGS" 1245 CXXFLAGS="$CXXFLAGS -std=gnu++11" 1246 AC_TRY_COMPILE([#include <unordered_set>], [using std::unordered_set;], 1247 ac_cv_cxx_unordered_set=yes, ac_cv_cxx_unordered_set=no) 1248 CXXFLAGS="$ac_save_CXXFLAGS" 1249 AC_LANG_RESTORE 1250 ]) 1251 if test "$ac_cv_cxx_unordered_set" = yes; then 1252 AC_DEFINE(HAVE_UNORDERED_SET,,[Define if unordered_set is present. ]) 1253 fi 1254]) 1255</programlisting> 1256 1257<para> 1258 Some C++11 features first appeared in GCC 4.3 and could be enabled by 1259 <option>-std=c++0x</option> and <option>-std=gnu++0x</option> for GCC 1260 releases which pre-date the 2011 standard. Those C++11 features and GCC's 1261 support for them were still changing until the 2011 standard was finished, 1262 but the autoconf checks above could be extended to test for incomplete 1263 C++11 support with <option>-std=c++0x</option> and 1264 <option>-std=gnu++0x</option>. 1265</para> 1266 1267</section> 1268 1269<section xml:id="backwards.third.iterator_type"><info><title> 1270 <code>Container::iterator_type</code> is not necessarily <code>Container::value_type*</code> 1271</title></info> 1272 1273 1274<para> 1275 This is a change in behavior from older versions. Now, most 1276 <type>iterator_type</type> typedefs in container classes are POD 1277 objects, not <type>value_type</type> pointers. 1278</para> 1279</section> 1280 1281</section> 1282 1283<bibliography xml:id="backwards.biblio"><info><title>Bibliography</title></info> 1284 1285 1286 <biblioentry> 1287 <title> 1288 <link xmlns:xlink="http://www.w3.org/1999/xlink" 1289 xlink:href="http://www.kegel.com/gcc/gcc4.html"> 1290 Migrating to GCC 4.1 1291 </link> 1292 </title> 1293 1294 <author><personname><firstname>Dan</firstname><surname>Kegel</surname></personname></author> 1295 </biblioentry> 1296 1297 <biblioentry> 1298 <title> 1299 <link xmlns:xlink="http://www.w3.org/1999/xlink" 1300 xlink:href="http://lists.debian.org/debian-gcc/2006/03/msg00405.html"> 1301 Building the Whole Debian Archive with GCC 4.1: A Summary 1302 </link> 1303 </title> 1304 <author><personname><firstname>Martin</firstname><surname>Michlmayr</surname></personname></author> 1305 </biblioentry> 1306 1307 <biblioentry> 1308 <title> 1309 <link xmlns:xlink="http://www.w3.org/1999/xlink" 1310 xlink:href="http://annwm.lbl.gov/~leggett/Atlas/gcc-3.2.html"> 1311 Migration guide for GCC-3.2 1312 </link> 1313 </title> 1314 1315 </biblioentry> 1316 1317</bibliography> 1318 1319</section> 1320