1[/ 2 Boost.Config 3 4 Copyright (c) 2001 Beman Dawes 5 Copyright (c) 2001 Vesa Karvonen 6 Copyright (c) 2001 John Maddock 7 8 Distributed under the Boost Software License, Version 1.0. 9 (See accompanying file LICENSE_1_0.txt or copy at 10 http://www.boost.org/LICENSE_1_0.txt) 11] 12 13 14 15[section Boost Macro Reference] 16 17[#config_defects] 18 19[section Macros that describe C++03 defects] 20 21The following macros all describe features that are required by the C++03 standard, 22if one of the following macros is defined, then it represents a defect in the 23compiler's conformance with the 2003 standard. 24 25 26[table 27[[Macro ][Section ][ Description ]] 28 29 30[[`BOOST_BCB_PARTIAL_SPECIALIZATION_BUG`][Compiler][ 31The compiler exhibits certain partial specialisation bug - probably Borland 32C++ Builder specific. 33]] 34[[`BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL`][Compiler][ 35Argument dependent lookup fails if there is a using declaration for the 36symbol being looked up in the current scope. For example, using 37`boost::get_pointer`; prevents ADL from finding overloads of `get_pointer` 38in namespaces nested inside boost (but not elsewhere). Probably 39Borland specific. 40]] 41[[`BOOST_NO_ADL_BARRIER`][Compiler][ 42The compiler locates and searches namespaces that it should /*not*/ in fact 43search when performing argument dependent lookup. 44]] 45[[`BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP`][Compiler][ 46Compiler does not implement argument-dependent lookup (also named 47Koenig lookup); see std::3.4.2 \[basic.koenig.lookup\] 48]] 49[[`BOOST_NO_AUTO_PTR`][Standard library][ 50If the compiler / library supplies non-standard or broken `std::auto_ptr`. 51]] 52[[`BOOST_NO_COMPLETE_VALUE_INITIALIZATION`][Compiler][ 53Compiler has not completely implemented value-initialization. 54See also [@../../../utility/value_init.htm#compiler_issues The Utility\/Value Init docs] 55]] 56[[`BOOST_NO_CTYPE_FUNCTIONS`][Platform][ 57The Platform does not provide functions for the character-classifying 58operations `<ctype.h>` and `<cctype>`, only macros. 59]] 60[[`BOOST_NO_CV_SPECIALIZATIONS`][Compiler][ 61If template specialisations for cv-qualified types conflict with a 62specialisation for a cv-unqualififed type. 63]] 64[[`BOOST_NO_CV_VOID_SPECIALIZATIONS`][Compiler][ 65If template specialisations for cv-void types conflict with a specialisation 66for void. 67]] 68[[`BOOST_NO_CWCHAR`][Platform][ 69The Platform does not provide `<wchar.h>` and `<cwchar>`. 70]] 71[[`BOOST_NO_CWCTYPE`][Platform][ 72The Platform does not provide `<wctype.h>` and `<cwctype>`. 73]] 74[[`BOOST_NO_FENV_H`][Platform, Standard library][ 75The C standard library doesn't provide `<fenv.h>`. [@../../../../boost/detail/fenv.hpp 76`<boost/detail/fenv.hpp>`] should be included instead of `<fenv.h>` for maximum 77portability on platforms which do provide `<fenv.h>`. 78]] 79[[`BOOST_NO_DEPENDENT_NESTED_DERIVATIONS`][Compiler][ 80The compiler fails to compile a nested class that has a dependent base class: 81`` 82template<typename T> 83struct foo : { 84 template<typename U> 85 struct bar : public U {}; 86`` 87}; 88]] 89[[`BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS`][Compiler][ 90Template value parameters cannot have a dependent type, for example: 91`` 92template<class T, typename T::type value> 93class X { ... }; 94`` 95]] 96[[`BOOST_NO_EXCEPTION_STD_NAMESPACE`][Standard Library][ 97The standard library does not put some or all of the contents of 98`<exception>` in namespace std. 99]] 100[[`BOOST_NO_EXCEPTIONS`][Compiler][ 101The compiler does not support exception handling (this setting is typically 102required by many C++ compilers for embedded platforms). Note that there is 103no requirement for boost libraries to honor this configuration setting - 104indeed doing so may be impossible in some cases. Those libraries that do 105honor this will typically abort if a critical error occurs - you have been 106warned! 107]] 108[[`BOOST_NO_FUNCTION_TEMPLATE_ORDERING`][Compiler][ 109The compiler does not perform function template ordering or its function 110template ordering is incorrect. 111`` 112// #1 113template<class T> void f(T); 114 115// #2 116template<class T,class U> void f(T(*)(U)); 117 118void bar(int); 119 120f(&bar); // should choose #2. 121`` 122]] 123[[`BOOST_NO_INCLASS_MEMBER_INITIALIZATION`][Compiler][ 124Compiler violates std::9.4.2/4. 125]] 126[[`BOOST_NO_INTRINSIC_WCHAR_T`][Compiler][ 127The C++ implementation does not provide `wchar_t`, or it is really a synonym 128for another integral type. Use this symbol to decide whether it is appropriate 129to explicitly specialize a template on `wchar_t` if there is already a 130specialization for other integer types. 131]] 132[[`BOOST_NO_IOSFWD`][std lib][ 133The standard library lacks `<iosfwd>`. 134]] 135[[`BOOST_NO_IOSTREAM`][std lib][ 136The standard library lacks `<iostream>`, `<istream>` or `<ostream>`. 137]] 138[[`BOOST_NO_IS_ABSTRACT`][Compiler][ 139The C++ compiler does not support SFINAE with abstract types, this is covered 140by __CORE_LANGUAGE_DR337__, but is not part of the current standard. Fortunately 141most compilers that support SFINAE also support this DR. See also BOOST_NO_SFINAE and BOOST_NO_SFINAE_EXPR 142]] 143[[`BOOST_NO_LIMITS`][Standard library][ 144The C++ implementation does not provide the `<limits>` header. Never check for 145this symbol in library code; always include `<boost/limits.hpp>`, which 146guarantees to provide `std::numeric_limits`. 147]] 148[[`BOOST_NO_CXX11_NUMERIC_LIMITS`][Standard library][ 149C++11 additions to `std::numeric_limits` are not available for use. 150`static function numeric_limits<T>::lowest()` the lowest finite value representable by the numeric type. 151`static int const max_digits10` the number of decimal digits that are required to make sure that two distinct values of the type have distinct decimal representations. 152`template<> class numeric_limits<char16_t>;`, see also `BOOST_NO_CXX11_CHAR16_T`, 153`template<> class numeric_limits<char32_t>;` see also `BOOST_NO_CXX11_CHAR32_T`. 154Replaces BOOST_NO_NUMERIC_LIMITS_LOWEST. 155]] 156[[`BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS`][Standard library][ 157Constants such as `numeric_limits<T>::is_signed` are not available for use 158at compile-time. 159]] 160[[`BOOST_NO_LONG_LONG_NUMERIC_LIMITS`][Standard library][ 161There is no specialization for `numeric_limits<long long>` and 162`numeric_limits<unsigned long long>`. `<boost/limits.hpp>` will then add these 163specializations as a standard library "fix" only if the compiler supports the 164`long long` datatype. 165]] 166[[`BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS`][Compiler][ 167The compiler does not support the specialization of individual member 168functions of template classes. 169]] 170[[`BOOST_NO_MEMBER_TEMPLATE_KEYWORD`][Compiler][ 171If the compiler supports member templates, but not the template keyword 172when accessing member template classes. 173]] 174[[`BOOST_NO_MEMBER_TEMPLATE_FRIENDS`][Compiler][ 175Member template friend syntax (`template<class P> friend class frd;`) 176described in the C++ Standard, 14.5.3, not supported. 177]] 178[[`BOOST_NO_MEMBER_TEMPLATES`][Compiler][ 179Member template functions not fully supported. 180]] 181[[`BOOST_NO_MS_INT64_NUMERIC_LIMITS`][Standard library][ 182There is no specialization for `numeric_limits<__int64>` and 183`numeric_limits<unsigned __int64>`. `<boost/limits.hpp>` will then add these 184specializations as a standard library "fix", only if the compiler supports 185the `__int64` datatype. 186]] 187[[`BOOST_NO_NESTED_FRIENDSHIP`][Compiler][ 188Compiler doesn't allow a nested class to access private members of its 189containing class. Probably Borland/CodeGear specific. 190]] 191[[`BOOST_NO_OPERATORS_IN_NAMESPACE`][Compiler][ 192Compiler requires inherited operator friend functions to be defined at 193namespace scope, then using'ed to boost. Probably GCC specific. See 194[@../../../../boost/operators.hpp `<boost/operators.hpp>`] for example. 195]] 196[[`BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS`][Compiler][ 197The compiler does not correctly handle partial specializations 198which depend upon default arguments in the primary template. 199]] 200[[`BOOST_NO_POINTER_TO_MEMBER_CONST`][Compiler][ 201The compiler does not correctly handle pointers to const member functions, 202preventing use of these in overloaded function templates. See 203[@../../../../boost/functional.hpp `<boost/functional.hpp>`] for example. 204]] 205[[`BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS`][Compiler][ 206Pointers to members don't work when used as template parameters. 207]] 208[[`BOOST_NO_PRIVATE_IN_AGGREGATE`][Compiler][ 209The compiler misreads 8.5.1, treating classes as non-aggregate if they 210contain private or protected member functions. 211]] 212[[`BOOST_NO_RESTRICT_REFERENCES`][Compiler][ 213Compiler-specific `restrict` keyword can not be applied to references. 214]] 215[[`BOOST_NO_RTTI`][Compiler][ 216The compiler may (or may not) have the typeid operator, but RTTI on the dynamic type 217of an object is not supported. 218]] 219[[`BOOST_NO_SFINAE`][Compiler][ 220The compiler does not support the "Substitution Failure Is Not An Error" 221meta-programming idiom. This is the lightweight pre-C++11 version of SFINAE. 222]] 223[[`BOOST_NO_SFINAE_EXPR`][Compiler][ 224The compiler does not support usage of SFINAE with arbitrary expressions. This is the 225post-C++11 SFINAE, but excludes a few specific corner cases, see also BOOST_NO_CXX11_SFINAE_EXPR. 226]] 227[[`BOOST_NO_STD_ALLOCATOR`][Standard library][ 228The C++ standard library does not provide a standards conforming 229`std::allocator`. 230]] 231[[`BOOST_NO_STD_DISTANCE`][Standard library][ 232The platform does not have a conforming version of `std::distance`. 233]] 234[[`BOOST_NO_STD_ITERATOR`][Standard library][ 235The C++ implementation fails to provide the `std::iterator` class. 236Note that post C++17, this macro is re-purposed to indicate that std::iterator has been removed or deprecated. 237]] 238[[`BOOST_NO_STD_ITERATOR_TRAITS`][Standard library][ 239The compiler does not provide a standard compliant implementation of 240`std::iterator_traits`. Note that the compiler may still have a 241non-standard implementation. 242]] 243[[`BOOST_NO_STD_LOCALE`][Standard library][ 244The standard library lacks `std::locale`. 245]] 246[[`BOOST_NO_STD_MESSAGES`][Standard library][ 247The standard library lacks a conforming `std::messages` facet. 248]] 249[[`BOOST_NO_STD_MIN_MAX`][Standard library][ 250The C++ standard library does not provide the `min()` and `max()` template 251functions that should be in `<algorithm>`. 252]] 253[[`BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN`][Standard library][ 254Defined if the standard library's output iterators are not assignable. 255]] 256[[`BOOST_NO_STD_TYPEINFO`][Standard library][ 257The <typeinfo> header declares `type_info` in the global namespace instead of namespace std. 258]] 259[[`BOOST_NO_STD_USE_FACET`][Standard library][ 260The standard library lacks a conforming `std::use_facet`. 261]] 262[[`BOOST_NO_STD_WSTREAMBUF`][Standard library][ 263The standard library's implementation of `std::basic_streambuf<wchar_t>` 264is either missing, incomplete, or buggy. 265]] 266[[`BOOST_NO_STD_WSTRING`][Standard library][ 267The standard library lacks `std::wstring`. 268]] 269[[`BOOST_NO_STDC_NAMESPACE`][Compiler, Platform][ 270The contents of C++ standard headers for C library functions 271(the `<c...>` headers) have not been placed in namespace std. This test is 272difficult - some libraries "fake" the std C functions by adding using 273declarations to import them into namespace std, unfortunately they don't 274necessarily catch all of them... 275]] 276[[`BOOST_NO_STRINGSTREAM`][Standard library][ 277The C++ implementation does not provide the `<sstream>` header. 278]] 279[[`BOOST_NO_SWPRINTF`][Platform][ 280The platform does not have a conforming version of `swprintf`. 281]] 282[[`BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION`][Compiler][ 283Class template partial specialization (14.5.4 \[temp.class.spec\]) not 284supported. 285]] 286[[`BOOST_NO_TEMPLATED_IOSTREAMS`][Standard library][ 287The standard library does not provide templated iostream classes. 288]] 289[[`BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS`][Standard library][ 290The standard library does not provide templated iterator constructors 291for its containers. 292]] 293[[`BOOST_NO_TEMPLATE_TEMPLATES`][Compiler][ 294The compiler does not support template template parameters. 295]] 296[[`BOOST_NO_TYPEID`][Compiler][ 297The compiler does not support the typeid operator at all. 298]] 299[[`BOOST_NO_TYPENAME_WITH_CTOR`][Compiler][ 300The typename keyword cannot be used when creating a temporary of a 301Dependent type. 302]] 303[[`BOOST_NO_UNREACHABLE_RETURN_DETECTION`][Compiler][ 304If a return is unreachable, then no return statement should be required, 305however some compilers insist on it, while other issue a bunch of warnings 306if it is in fact present. 307]] 308[[`BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE`][Compiler][ 309The compiler will not accept a using declaration that brings a function 310from a typename used as a base class into a derived class if functions of 311the same name are present in the derived class. 312]] 313[[`BOOST_NO_USING_TEMPLATE`][Compiler][ 314The compiler will not accept a using declaration that imports a template 315class or function from another namespace. Originally a Borland specific 316problem with imports to/from the global namespace, extended to MSVC6 317which has a specific issue with importing template classes (but not 318functions). 319]] 320[[`BOOST_NO_VOID_RETURNS`][Compiler][ 321The compiler does not allow a void function to return the result of calling 322another void function. 323`` 324void f() {} 325void g() { return f(); } 326`` 327]] 328] 329 330[endsect] 331 332[#config_features] 333 334 335[section Macros that describe optional features] 336 337The following macros describe features that are not required by the C++ 338standard. The macro is only defined if the feature is present. 339 340 341[table 342[[Macro ][Section ][Description ]] 343 344[[`BOOST_HAS_BETHREADS`][Platform][ 345The platform supports BeOS style threads. 346]] 347[[`BOOST_HAS_CLOCK_GETTIME`][Platform][ 348The platform has the POSIX API `clock_gettime`. 349]] 350[[`BOOST_HAS_DIRENT_H`][Platform][ 351The platform has the POSIX header `<dirent.h>`. 352]] 353[[`BOOST_HAS_EXPM1`][Platform][ 354The platform has the functions `expm1`, `expm1f` and `expm1l` in `<math.h>` 355]] 356[[`BOOST_HAS_FLOAT128`][Compiler][ 357The compiler has `__float128` as a native type which is distinct 358from all the regular C++ floating point types.]] 359[[`BOOST_HAS_FTIME`][Platform][ 360The platform has the Win32 API type FTIME. 361]] 362[[`BOOST_HAS_GETSYSTEMTIMEASFILETIME`][Platform][ 363The platform has the Win32 API GetSystemTimeAsFileTime. 364]] 365[[`BOOST_HAS_GETTIMEOFDAY`][Platform][ 366The platform has the POSIX API `gettimeofday`. 367]] 368[[`BOOST_HAS_HASH`][Standard library][ 369The C++ implementation provides the (SGI) hash_set and hash_map classes. 370When defined, `BOOST_HASH_SET_HEADER` and `BOOST_HASH_LIST_HEADER` will contain 371the names of the header needed to access hash_set and hash_map; 372`BOOST_STD_EXTENSION_NAMESPACE` will provide the namespace in which the two 373class templates reside. 374]] 375[[`BOOST_HAS_INT128`][Compiler][ 376The compiler has `__int128` and `unsigned __int128` as native types which are distinct 377from all the regular C++ integer types.]] 378[[`BOOST_HAS_LOG1P`][Platform][ 379The platform has the functions `log1p`, `log1pf` and `log1pl` in `<math.h>`. 380]] 381[[`BOOST_HAS_MACRO_USE_FACET`][Standard library][ 382The standard library lacks a conforming `std::use_facet`, but has a macro 383`_USE(loc, Type)` that does the job. This is primarily for the Dinkumware 384std lib. 385]] 386[[`BOOST_HAS_MS_INT64`][Compiler][ 387The compiler supports the `__int64` data type. 388]] 389[[`BOOST_HAS_NANOSLEEP`][Platform][ 390The platform has the POSIX API nanosleep. 391]] 392[[`BOOST_HAS_NL_TYPES_H`][Platform][ 393The platform has an `<nl_types.h>`. 394]] 395[[`BOOST_HAS_NRVO`][Compiler][ 396Indicated that the compiler supports the named return value optimization 397(NRVO). Used to select the most efficient implementation for some function. 398See [@../../../../boost/operators.hpp `<boost/operators.hpp>`] for example. 399]] 400[[`BOOST_HAS_PARTIAL_STD_ALLOCATOR`][Standard Library][ 401The standard library has a partially conforming `std::allocator` class, but 402without any of the member templates. 403]] 404[[`BOOST_HAS_PRAGMA_ONCE`][Compiler][ 405The compiler recognizes the `#pragma once` directive which tells that the 406containing header should be included only once while preprocessing the 407current translation unit. The pragma may improve compile times of large projects 408with some compilers. 409]] 410[[`BOOST_HAS_PRAGMA_DETECT_MISMATCH`][Compiler][ 411The compiler recognizes the `#pragma detect_mismatch("name", "value")` directive which tells that the 412link stage should be terminated with error if values for provided `"name"` missmatch. 413This pragma may be a help in preventing ODR violations and ensuring that different modules 414are compiled with same flags. 415]] 416 417[[`BOOST_HAS_PTHREAD_DELAY_NP`][Platform][ 418The platform has the POSIX API `pthread_delay_np`. 419]] 420[[`BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE`][Platform][ 421The platform has the POSIX API `pthread_mutexattr_settype`. 422]] 423[[`BOOST_HAS_PTHREAD_YIELD`][Platform][ 424The platform has the POSIX API `pthread_yield`. 425]] 426[[`BOOST_HAS_PTHREADS`][Platform][ 427The platform support POSIX style threads. 428]] 429[[`BOOST_HAS_SCHED_YIELD`][Platform][ 430The platform has the POSIX API `sched_yield`. 431]] 432[[`BOOST_HAS_SGI_TYPE_TRAITS`][Compiler, Standard library][ 433The compiler has native support for SGI style type traits. 434]] 435[[`BOOST_HAS_STDINT_H`][Platform][ 436The platform has a `<stdint.h>` 437]] 438[[`BOOST_HAS_SLIST`][Standard library][ 439The C++ implementation provides the (SGI) slist class. When defined, 440`BOOST_SLIST_HEADER` will contain the name of the header needed to access 441`slist` and `BOOST_STD_EXTENSION_NAMESPACE` will provide the namespace in 442which `slist` resides. 443]] 444[[`BOOST_HAS_STLP_USE_FACET`][Standard library][ 445The standard library lacks a conforming `std::use_facet`, but has a workaround 446class-version that does the job. This is primarily for the STLport std lib. 447]] 448[[`BOOST_HAS_TR1_ARRAY`][Standard library][ 449The library has a TR1 conforming version of `<array>`. This macro is only guaranteed 450to be defined after including one of the headers from Boost.TR1. Further this macro 451is now deprecated in favour of BOOST_NO_CXX11_HDR_ARRAY. 452]] 453[[`BOOST_HAS_TR1_COMPLEX_OVERLOADS`][Standard library][ 454The library has a version of `<complex>` that supports passing scalars to the 455complex number algorithms. 456]] 457[[`BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG`][Standard library][ 458The library has a version of `<complex>` that includes the new inverse trig 459functions from TR1. 460]] 461[[`BOOST_HAS_TR1_REFERENCE_WRAPPER`][Standard library][ 462The library has TR1 conforming reference wrappers in `<functional>`. This macro is only guaranteed 463to be defined after including one of the headers from Boost.TR1. Further this macro 464is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL. 465]] 466[[`BOOST_HAS_TR1_RESULT_OF`][Standard library][ 467The library has a TR1 conforming result_of template in `<functional>`. This macro is only guaranteed 468to be defined after including one of the headers from Boost.TR1. Further this macro 469is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL. 470]] 471[[`BOOST_HAS_TR1_MEM_FN`][Standard library][ 472The library has a TR1 conforming mem_fn function template in `<functional>`. This macro is only guaranteed 473to be defined after including one of the headers from Boost.TR1. Further this macro 474is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL. 475]] 476[[`BOOST_HAS_TR1_BIND`][Standard library][ 477The library has a TR1 conforming bind function template in `<functional>`. This macro is only guaranteed 478to be defined after including one of the headers from Boost.TR1. Further this macro 479is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL. 480]] 481[[`BOOST_HAS_TR1_FUNCTION`][Standard library][ 482The library has a TR1 conforming function class template in `<functional>`. This macro is only guaranteed 483to be defined after including one of the headers from Boost.TR1. Further this macro 484is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL. 485]] 486[[`BOOST_HAS_TR1_HASH`][Standard library][ 487The library has a TR1 conforming hash function template in `<functional>`. This macro is only guaranteed 488to be defined after including one of the headers from Boost.TR1. Further this macro 489is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL. 490]] 491[[`BOOST_HAS_TR1_SHARED_PTR`][Standard library][ 492The library has a TR1 conforming `shared_ptr` class template in `<memory>`. This macro is only guaranteed 493to be defined after including one of the headers from Boost.TR1. Further this macro 494is now deprecated in favour of BOOST_NO_CXX11_SMART_PTR. 495]] 496[[`BOOST_HAS_TR1_RANDOM`][Standard library][ 497The library has a TR1 conforming version of `<random>`. This macro is only guaranteed 498to be defined after including one of the headers from Boost.TR1. Further this macro 499is now deprecated in favour of BOOST_NO_CXX11_HDR_RANDOM. 500]] 501[[`BOOST_HAS_TR1_REGEX`][Standard library][ 502The library has a TR1 conforming version of `<regex>`. This macro is only guaranteed 503to be defined after including one of the headers from Boost.TR1. Further this macro 504is now deprecated in favour of BOOST_NO_CXX11_HDR_REGEX. 505]] 506[[`BOOST_HAS_TR1_TUPLE`][Standard library][ 507The library has a TR1 conforming version of `<tuple>`. This macro is only guaranteed 508to be defined after including one of the headers from Boost.TR1. Further this macro 509is now deprecated in favour of BOOST_NO_CXX11_HDR_TUPLE. 510]] 511[[`BOOST_HAS_TR1_TYPE_TRAITS`][Standard library][ 512The library has a TR1 conforming version of `<type_traits>`. This macro is only guaranteed 513to be defined after including one of the headers from Boost.TR1. Further this macro 514is now deprecated in favour of BOOST_NO_CXX11_HDR_TYPE_TRAITS. 515]] 516[[`BOOST_HAS_TR1_UTILITY`][Standard library][ 517The library has the TR1 additions to `<utility>` (tuple interface to `std::pair`). This macro is only guaranteed 518to be defined after including one of the headers from Boost.TR1. Further this macro 519is now deprecated in favour of BOOST_NO_CXX11_HDR_TUPLE. 520]] 521[[`BOOST_HAS_TR1_UNORDERED_MAP`][Standard library][ 522The library has a TR1 conforming version of `<unordered_map>`. This macro is only guaranteed 523to be defined after including one of the headers from Boost.TR1. Further this macro 524is now deprecated in favour of BOOST_NO_CXX11_HDR_UNORDERED_MAP. 525]] 526[[`BOOST_HAS_TR1_UNORDERED_SET`][Standard library][ 527The library has a TR1 conforming version of `<unordered_set>`. This macro is only guaranteed 528to be defined after including one of the headers from Boost.TR1. Further this macro 529is now deprecated in favour of BOOST_NO_CXX11_HDR_UNORDERED_SET. 530]] 531[[`BOOST_HAS_TR1`][Standard library][ 532Implies all the other `BOOST_HAS_TR1_*` macros should be set. 533]] 534[[`BOOST_HAS_THREADS`][Platform, Compiler][ 535Defined if the compiler, in its current translation mode, supports multiple 536threads of execution. 537]] 538[[`BOOST_HAS_TWO_ARG_USE_FACET`][Standard library][ 539The standard library lacks a conforming std::use_facet, but has a two 540argument version that does the job. This is primarily for the Rogue Wave 541std lib. 542]] 543[[`BOOST_HAS_UNISTD_H`][Platform][ 544The Platform provides `<unistd.h>`. 545]] 546[[`BOOST_HAS_WINTHREADS`][Platform][ 547The platform supports MS Windows style threads. 548]] 549[[`BOOST_MSVC_STD_ITERATOR`][Standard library][ 550Microsoft's broken version of `std::iterator` is being used. This implies that 551`std::iterator` takes no more than two template parameters. 552]] 553[[`BOOST_MSVC6_MEMBER_TEMPLATES`][Compiler][ 554Microsoft Visual C++ 6.0 has enough member template idiosyncrasies 555(being polite) that `BOOST_NO_MEMBER_TEMPLATES` is defined for this compiler. 556`BOOST_MSVC6_MEMBER_TEMPLATES` is defined to allow compiler specific workarounds. 557This macro gets defined automatically if `BOOST_NO_MEMBER_TEMPLATES` is not 558defined - in other words this is treated as a strict subset of the features 559required by the standard. 560]] 561[[`BOOST_HAS_STDINT_H`][Platform][ 562There are no 1998 C++ Standard headers `<stdint.h>` or `<cstdint>`, although the 5631999 C Standard does include `<stdint.h>`. If `<stdint.h>` is present, 564`<boost/stdint.h>` can make good use of it, so a flag is supplied (signalling 565presence; thus the default is not present, conforming to the current C++ 566standard). 567]] 568] 569 570[endsect] 571 572[section Macros that describe possible C++ future features] 573 574The following macros describe features that may be included in some future 575ISO C++ standard, but have not yet been approved for inclusion in the language. 576 577 578[table 579[[Macro ][Description ]] 580 581[[`BOOST_HAS_CONCEPTS`][ 582The compiler supports concepts. 583]] 584] 585 586[endsect] 587 588[section Macros that describe C++11 features not supported] 589 590The following macros describe features in the 2011 ISO C++ standard, formerly known as C++0x, 591that are not yet supported by a particular compiler or library. 592 593[table 594[[Macro ][Description ]] 595 596[[`BOOST_NO_CXX11_ADDRESSOF`][The standard library header <memory> has no working std::addressof.]] 597[[`BOOST_NO_CXX11_ALIGNAS`][The compiler does not support the `alignas` keyword.]] 598[[`BOOST_NO_CXX11_ALLOCATOR`][The standard library does not provide a C++11 version of `std::allocator` in <memory>.]] 599[[`BOOST_NO_CXX11_ATOMIC_SMART_PTR`][The standard library <memory> does not support atomic smart pointer operations.]] 600[[`BOOST_NO_CXX11_AUTO_DECLARATIONS`][The compiler does not support 601type deduction for variables declared with the `auto` keyword (`auto var = ...;`). 602]] 603[[`BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS`][The compiler does not support 604type deduction for multiple variables declared with the `auto` keyword (`auto var = ..., *ptr = ...;`). 605]] 606[[`BOOST_NO_CXX11_CHAR16_T`][The compiler does not support 607type `char16_t`. 608]] 609[[`BOOST_NO_CXX11_CHAR32_T`][The compiler does not support 610type `char32_t`. 611]] 612[[`BOOST_NO_CXX11_CONSTEXPR`][The compiler does not support 613`constexpr`. 614]] 615[[`BOOST_NO_CXX11_DECLTYPE`][The compiler does not support 616`decltype`. 617]] 618[[`BOOST_NO_CXX11_DECLTYPE_N3276`][The compiler does not support the extension to 619`decltype` described in [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf N3276], 620accepted in Madrid, March 2011. 621]] 622[[`BOOST_NO_CXX11_DELETED_FUNCTIONS`][The compiler does not support 623deleted (`= delete`) functions. 624]] 625[[`BOOST_NO_CXX11_DEFAULTED_FUNCTIONS`][The compiler does not support 626defaulted (`= default`) functions. 627]] 628[[`BOOST_NO_CXX11_DEFAULTED_MOVES`][The compiler does not support 629defaulted move constructor or assignment. Other defaulted functions may still be supported. 630]] 631[[`BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS`][The compiler does not support 632explicit conversion operators (`explicit operator T()`). 633]] 634[[`BOOST_NO_CXX11_EXTERN_TEMPLATE`][The compiler does not support 635explicit instantiation forward declarations for templates (`extern template ...`). 636]] 637[[`BOOST_NO_CXX11_FINAL`][The compiler does not support the C++ class-virt-specifier final. 638]] 639[[`BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS`][The compiler does not support 640expanding a variadic template parameter pack into a template containing one or more 641fixed arguments]] 642[[`BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS`][The compiler does not support 643default template arguments for function templates. 644]] 645[[`BOOST_NO_CXX11_HDR_ATOMIC`][The standard library does not provide header <atomic>.]] 646[[`BOOST_NO_CXX11_HDR_ARRAY`][The standard library does not provide header <array>.]] 647[[`BOOST_NO_CXX11_HDR_CHRONO`][The standard library does not provide header <chrono>.]] 648[[`BOOST_NO_CXX11_HDR_CODECVT`][The standard library does not provide header <codecvt>.]] 649[[`BOOST_NO_CXX11_HDR_CONDITION_VARIABLE`][The standard library does not provide header <condition_variable>.]] 650[[`BOOST_NO_CXX11_HDR_EXCEPTION`][The standard library does not provide a C++11 compatible version of <exception>.]] 651[[`BOOST_NO_CXX11_HDR_FORWARD_LIST`][The standard library does not provide header <forward_list>.]] 652[[`BOOST_NO_CXX11_HDR_FUNCTIONAL`][The standard library does not provide a C++11 compatible version of <functional>.]] 653[[`BOOST_NO_CXX11_HDR_FUTURE`][The standard library does not provide header <future>.]] 654[[`BOOST_NO_CXX11_HDR_INITIALIZER_LIST`][The standard library does not provide header <initializer_list>.]] 655[[`BOOST_NO_CXX11_HDR_MUTEX`][The standard library does not provide header <mutex>.]] 656[[`BOOST_NO_CXX11_HDR_RANDOM`][The standard library does not provide header <random>.]] 657[[`BOOST_NO_CXX11_HDR_RATIO`][The standard library does not provide header <ratio>.]] 658[[`BOOST_NO_CXX11_HDR_REGEX`][The standard library does not provide header <regex>.]] 659[[`BOOST_NO_CXX11_HDR_SYSTEM_ERROR`][The standard library does not provide header <system_error>.]] 660[[`BOOST_NO_CXX11_HDR_THREAD`][The standard library does not provide header <thread>.]] 661[[`BOOST_NO_CXX11_HDR_TUPLE`][The standard library does not provide header <tuple>.]] 662[[`BOOST_NO_CXX11_HDR_TYPEINDEX`][The standard library does not provide header <typeindex>.]] 663[[`BOOST_NO_CXX11_HDR_TYPE_TRAITS`][The standard library does not provide header <type_traits>.]] 664[[`BOOST_NO_CXX11_HDR_UNORDERED_MAP`][The standard library does not provide header <unordered_map>.]] 665[[`BOOST_NO_CXX11_HDR_UNORDERED_SET`][The standard library does not provide header <unordered_set>.]] 666 667[[`BOOST_NO_CXX11_INLINE_NAMESPACES`][The compiler does not support inline namespaces.]] 668[[`BOOST_NO_CXX11_LAMBDAS`][The compiler does not support Lambdas. 669]] 670[[`BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS`][The compiler does not allow to 671pass local classes as template parameters (this macro intentionally does not 672control passing of unnamed types as template parameters, see also 673[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm N2657]). 674]] 675[[`BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS`][The compiler does not support 676defaulted (`= default`) functions in access control sections other than `public`. Public defaulted 677functions may still be supported, as indicated by `BOOST_NO_CXX11_DEFAULTED_FUNCTIONS`. Some 678compilers implementing an early draft of the C++11 standard (in particular, incorporating 679[@http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#906 DR906]) are susceptible to this problem. 680]] 681[[`BOOST_NO_CXX11_NOEXCEPT`][The compiler does not support `noexcept`. 682]] 683[[`BOOST_NO_CXX11_NULLPTR`][The compiler does not support `nullptr`. 684]] 685[[`BOOST_NO_CXX11_NUMERIC_LIMITS`][The standard library `<limits>` header does 686not support the C++11 version of `numeric_limits`. 687]] 688[[`BOOST_NO_CXX11_OVERRIDE`][The compiler does not support `override`. 689]] 690[[`BOOST_NO_CXX11_POINTER_TRAITS`][The standard library does not provide a 691C++11 version of `std::pointer_traits` in <memory>.]] 692[[`BOOST_NO_CXX11_RANGE_BASED_FOR`][The compiler does not support 693range-based for statements. 694]] 695[[`BOOST_NO_CXX11_RAW_LITERALS`][The compiler does not support 696raw string literals. 697]] 698[[`BOOST_NO_CXX11_REF_QUALIFIERS`][The compiler does not support 699ref-qualifiers on member functions as described in 700[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm N2439]. 701]] 702[[`BOOST_NO_CXX11_RVALUE_REFERENCES`][The compiler does not support 703r-value references. 704]] 705[[`BOOST_NO_CXX11_SCOPED_ENUMS`][The compiler does not support 706scoped enumerations (`enum class`). 707]] 708[[`BOOST_NO_CXX11_SFINAE_EXPR`][The compiler does not support 709usage of C++11 SFINAE with arbitrary expressions. Use this macro only if you 710are using all of the features of SFINAE including substitution-failure-on-private-member-access. 711Otherwise use BOOST_NO_SFINAE_EXPR or BOOST_NO_SFINAE which get defined for fewer compilers. 712]] 713[[`BOOST_NO_CXX11_SMART_PTR`][The standard library header <memory> has no shared_ptr and unique_ptr.]] 714[[`BOOST_NO_CXX11_STATIC_ASSERT`][The compiler does not support 715`static_assert`. 716]] 717[[`BOOST_NO_CXX11_STD_ALIGN`][The standard library header <memory> has no working std::align.]] 718[[`BOOST_NO_CXX11_STD_UNORDERED`][The standard library does not support 719<unordered_map> and <unordered_set>. 720]] 721[[`BOOST_NO_CXX11_TEMPLATE_ALIASES`][The compiler does not support template aliases. 722]] 723[[`BOOST_NO_CXX11_THREAD_LOCAL`][The compiler does not support the `thread_local` storage specifier. 724]] 725[[`BOOST_NO_CXX11_TRAILING_RESULT_TYPES`][The compiler does not support the new function result type 726specification syntax (e.g. `auto foo(T) -> T;`).]] 727[[`BOOST_NO_CXX11_UNICODE_LITERALS`][The compiler does not support 728Unicode (`u8`, `u`, `U`) literals. 729]] 730[[`BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX`][The compiler does not support 731the [@http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization C++11 Unified Initialization Syntax]. 732]] 733[[`BOOST_NO_CXX11_UNRESTRICTED_UNION`][The compiler does not support an unrestricted union. This is 734a union that may contain static data as well as user-defined member data with non-trivial special 735member functions. 736]] 737[[`BOOST_NO_CXX11_USER_DEFINED_LITERALS`][The compiler does not support user defined literals. 738]] 739[[`BOOST_NO_CXX11_VARIADIC_TEMPLATES`][The compiler does not support 740variadic templates. 741]] 742[[`BOOST_NO_CXX11_VARIADIC_MACROS`][The compiler does not support 743variadic macros. 744]] 745[[`BOOST_NO_LONG_LONG`][The compiler does not support `long long`. 746]] 747] 748 749[endsect] 750 751[#config_11_for_03] 752 753[section Macros that allow use of C++11 features with C++03 compilers] 754 755The following macros allow use of C++11 features even with compilers that do not yet 756provide compliant C++11 support. 757 758[table 759[[Macro ][ Description ]] 760 761[[`BOOST_ALIGNMENT(X)`, `BOOST_NO_ALIGNMENT`][ 762Some compilers don't support the `alignas` keyword but provide other means to specify alignment 763(usually, through compiler-specific attributes). The macro `BOOST_ALIGNMENT(X)` will expand to the `alignas(X)` 764keyword if the compiler supports it or to some compiler-specific attribute to achieve the specified alignment. 765If no such compiler-specific attribute is known then `BOOST_ALIGNMENT(X)` will expand to nothing and 766`BOOST_NO_ALIGNMENT` will be defined. Unlike native `alignas`, `X` must always be a compile-time integer constant. 767The macro can be used to specify alignment of types and data: 768`` 769 struct BOOST_ALIGNMENT(16) my_data 770 { 771 char c[16]; 772 }; 773 BOOST_ALIGNMENT(8) int arr[32]; 774`` 775]] 776[[`BOOST_CONSTEXPR`][ 777Some compilers don't support the use of `constexpr`. This macro expands to nothing on those compilers, and `constexpr` 778elsewhere. For example, when defining a constexpr function or constructor replace: 779`` 780 constexpr tuple(); 781`` 782with: 783`` 784 BOOST_CONSTEXPR tuple(); 785`` 786]] 787[[`BOOST_CONSTEXPR_OR_CONST`][ 788Some compilers don't support the use of `constexpr`. This macro expands to `const` on those compilers, and `constexpr` 789elsewhere. For example, when defining const expr variables replace: 790`` 791 static constexpr UIntType xor_mask = a; 792`` 793with: 794`` 795 static BOOST_CONSTEXPR_OR_CONST UIntType xor_mask = a; 796`` 797]] 798[[`BOOST_OVERRIDE`][ 799If `BOOST_NO_CXX11_OVERRIDE` is not defined (i.e. C++11 compliant compilers), 800expands to `override` keyword, otherwise expands to nothing. 801]] 802[[`BOOST_STATIC_CONSTEXPR`][ 803This is a shortcut for `static BOOST_CONSTEXPR_OR_CONST`. For example, when defining const expr variables replace: 804`` 805 static constexpr UIntType xor_mask = a; 806`` 807with: 808`` 809 BOOST_STATIC_CONSTEXPR UIntType xor_mask = a; 810`` 811]] 812[[`BOOST_DEFAULTED_FUNCTION(fun, body)`][ 813This macro is intended to be used within a class definition in order to declare a default implementation of function `fun`. 814For the compilers that do not support C++11 defaulted functions the macro will expand into an inline function definition 815with the `body` implementation. For example: 816`` 817 struct my_struct 818 { 819 BOOST_DEFAULTED_FUNCTION(my_struct(), {}) 820 }; 821`` 822is equivalent to: 823`` 824 struct my_struct 825 { 826 my_struct() = default; 827 }; 828`` 829or: 830`` 831 struct my_struct 832 { 833 my_struct() {} 834 }; 835`` 836]] 837[[`BOOST_DELETED_FUNCTION(fun)`][ 838This macro is intended to be used within a class definition in order to declare a deleted function `fun`. 839For the compilers that do not support C++11 deleted functions the macro will expand into a private function 840declaration with no definition. Since the macro may change the access mode, it is recommended to use this macro 841at the end of the class definition. For example: 842`` 843 struct noncopyable 844 { 845 BOOST_DELETED_FUNCTION(noncopyable(noncopyable const&)) 846 BOOST_DELETED_FUNCTION(noncopyable& operator= (noncopyable const&)) 847 }; 848`` 849is equivalent to: 850`` 851 struct noncopyable 852 { 853 noncopyable(noncopyable const&) = delete; 854 noncopyable& operator= (noncopyable const&) = delete; 855 }; 856`` 857or: 858`` 859 struct noncopyable 860 { 861 private: 862 noncopyable(noncopyable const&); 863 noncopyable& operator= (noncopyable const&); 864 }; 865`` 866]] 867[[ 868`` 869 BOOST_NOEXCEPT 870 BOOST_NOEXCEPT_OR_NOTHROW 871 BOOST_NOEXCEPT_IF(Predicate) 872 BOOST_NOEXCEPT_EXPR(Expression) 873`` 874][ 875If `BOOST_NO_CXX11_NOEXCEPT` is defined (i.e. C++03 compliant compilers) these macros are defined as: 876[: 877`` 878 #define BOOST_NOEXCEPT 879 #define BOOST_NOEXCEPT_OR_NOTHROW throw() 880 #define BOOST_NOEXCEPT_IF(Predicate) 881 #define BOOST_NOEXCEPT_EXPR(Expression) false 882`` 883] 884If `BOOST_NO_CXX11_NOEXCEPT` is not defined (i.e. C++11 compliant compilers) they are defined as: 885[: 886`` 887 #define BOOST_NOEXCEPT noexcept 888 #define BOOST_NOEXCEPT_OR_NOTHROW noexcept 889 #define BOOST_NOEXCEPT_IF(Predicate) noexcept((Predicate)) 890 #define BOOST_NOEXCEPT_EXPR(Expression) noexcept((Expression)) 891`` 892] 893]] 894[[`BOOST_FINAL`][ 895If `BOOST_NO_CXX11_FINAL` is not defined (i.e. C++11 compliant compilers), expands to `final` keyword, 896otherwise expands to nothing. 897]] 898[[`BOOST_MSVC_ENABLE_2012_NOV_CTP`][ 899For Microsoft Visual C++ 2012, enable the C++11 features supplied by the 900November 2012 Community Technology Preview. These features are not automatically 901enabled because the CTP is non-supported alpha code that is not recommended 902for production use. This macro must be defined before including any Boost headers, 903and must be defined for all translation units in the program, including Boost library builds. 904This macro will no longer have any effect once an official Microsoft 905release supports the CTP features. 906]] 907] 908 909[endsect] 910 911[section Macros that describe C++14 features not supported] 912 913The following macros describe features in the 2014 ISO C++ standard, formerly known as C++0y, 914that are not yet supported by a particular compiler or library. 915 916[table 917[[Macro ][Description ]] 918[[`BOOST_NO_CXX14_AGGREGATE_NSDMI`][The compiler does not support member initializer for aggregates as in the following example: 919[: 920`` 921struct Foo 922{ 923 int x, y = 42; 924}; 925 926Foo foo = { 0 }; 927`` 928] 929]] 930[[`BOOST_NO_CXX14_BINARY_LITERALS`][The compiler does not binary literals (e.g. `0b1010`).]] 931[[`BOOST_NO_CXX14_CONSTEXPR`][The compiler does not support relaxed `constexpr`.]] 932[[`BOOST_NO_CXX14_DECLTYPE_AUTO`][The compiler does not support `decltype(auto)`.]] 933[[`BOOST_NO_CXX14_DIGIT_SEPARATORS`][The compiler does not support digit separators (e.g. `1'000'000`).]] 934[[`BOOST_NO_CXX14_STD_EXCHANGE`][The compiler does not support `std::exchange()`.]] 935[[`BOOST_NO_CXX14_GENERIC_LAMBDAS`][The compiler does not support generic lambda (e.g. `[](auto v){ }`).]] 936[[`BOOST_NO_CXX14_HDR_SHARED_MUTEX`][The standard library does not provide header <shared_mutex>.]] 937[[`BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES`][The compiler does not support initialized lambda capture (e.g. `[foo = 42]{ }`).]] 938[[`BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION`][The compiler does not support return type deduction for normal functions (e.g. `auto f() { return val; }`).]] 939[[`BOOST_NO_CXX14_VARIABLE_TEMPLATES`][The compiler does not support variable template (e.g. `template <class T> T kibi = T(1024);`).]] 940] 941 942[endsect] 943 944[#config_14_for_11] 945 946[section Macros that allow use of C++14 features with C++11 or earlier compilers] 947 948The following macros allow use of C++14 features even with compilers that do not yet 949provide compliant C++14 support. 950 951[table 952[[Macro ][ Description ]] 953[[`BOOST_CXX14_CONSTEXPR`][This macro works similar to `BOOST_CONSTEXPR`, but expands to `constexpr` only if the C++14 "relaxed" `constexpr` is available.]] 954] 955 956[endsect] 957 958[section Macros that describe C++17 features not supported] 959 960The following macros describe features in the 2017 ISO C++ standard, formerly known as C++1z, 961that are not yet supported by a particular compiler or library. 962 963[table 964[[Macro ][Description ]] 965[[`BOOST_NO_CXX17_HDR_OPTIONAL`][The compiler does not support the header `<optional>`.]] 966[[`BOOST_NO_CXX17_HDR_VARIANT`][The compiler does not support the header `<variant>`.]] 967[[`BOOST_NO_CXX17_HDR_STRING_VIEW`][The compiler does not support the header `<string_view>`.]] 968[[`BOOST_NO_CXX17_STD_APPLY`][The compiler does not support `std::apply()`.]] 969[[`BOOST_NO_CXX17_STD_INVOKE`][The compiler does not support `std::invoke()`.]] 970[[`BOOST_NO_CXX17_ITERATOR_TRAITS`][The compiler does not support SFINAE-friendly `std::iterator_traits`.]] 971[[`BOOST_NO_CXX17_IF_CONSTEXPR`][The compiler does not support `if constexpr`.]] 972[[`BOOST_NO_CXX17_INLINE_VARIABLES`][The compiler does not support `inline` variables.]] 973] 974 975[endsect] 976 977[#config_17_for_14] 978 979[section Macros that allow use of C++17 features with C++14 or earlier compilers] 980 981The following macros allow use of C++17 features even with compilers that do not yet 982provide compliant C++17 support. 983 984[table 985[[Macro ][ Description ]] 986[[`BOOST_INLINE_VARIABLE`][This macro expands to `inline` on compilers that support C++17 inline variables and to nothing otherwise. Users may need to check for `BOOST_NO_CXX17_INLINE_VARIABLES` for further adjustments to the code.]] 987[[`BOOST_IF_CONSTEXPR`][Expands to `if constexpr` when supported, or `if` otherwise.]] 988[[`BOOST_INLINE_CONSTEXPR`][This is a shortcut for `BOOST_INLINE_VARIABLE BOOST_CONSTEXPR_OR_CONST`.]] 989] 990 991[endsect] 992 993[section Macros that describe features that have been removed from the standard.] 994 995The following macros describe features which were required by one version of the standard, but have been removed by later versions. 996 997[table 998[[Macro ][Description ]] 999[[`BOOST_NO_CXX98_RANDOM_SHUFFLE`][The standard library no longer supports `std::random_shuffle()`. It was deprecated in C++11 and is removed from C++14.]] 1000[[`BOOST_NO_AUTO_PTR`][The standard library no longer supports `std::auto_ptr`. It was deprecated in C++11 and is removed from C++14.]] 1001[[`BOOST_NO_CXX98_FUNCTION_BASE`][The standard library no longer supports `std::unary_function` and `std::binary_function`. They were deprecated in C++11 and is removed from C++14.]] 1002[[`BOOST_NO_CXX98_BINDERS`][The standard library no longer supports `std::bind1st`, `std::bind2nd`, `std::ptr_fun` and `std::mem_fun`. They were deprecated in C++11 and is removed from C++14.]] 1003] 1004 1005[endsect] 1006 1007[#config_helpers] 1008 1009[section Boost Helper Macros] 1010 1011The following macros are either simple helpers, or macros that provide 1012workarounds for compiler/standard library defects. 1013 1014 1015[table 1016[[Macro ][Description ]] 1017 1018[[`BOOST_WORKAROUND`][ 1019This macro is used where a compiler specific workaround is required that is not otherwise 1020described by one of the other Boost.Config macros. To use the macro you must first 1021`` 1022#include <boost/config/workaround.hpp> 1023`` 1024usage is then: 1025`` 1026#if BOOST_WORKAROUND(MACRONAME, CONDITION) 1027 // workaround code goes here... 1028#else 1029 // Standard conforming code goes here... 1030#endif 1031`` 1032where `MACRONAME` is a macro that usually describes the version number to be tested against, and `CONDITION` 1033is a comparison operator followed by a value. For example `BOOST_WORKAROUND(BOOST_INTEL, <= 1010)` would 1034evaluate to `1` for Intel C++ 10.1 and earlier. 1035 1036The macro can also be used with `BOOST_TESTED_AT` if all 1037current compiler versions exhibit the issue, but the issue is expected to be fixed at some later point. 1038 1039For example 1040`BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x590))` would normally evaluate to `1` for all values 1041of `__BORLANDC__` /unless/ the macro `BOOST_DETECT_OUTDATED_WORKAROUNDS` is defined, in which case evaluates to 1042`(__BORLANDC__ <= 0x590)`. 1043 1044[*Note]: the ultimate source of documentation for this macro is in [@../../../../boost/config/workaround.hpp boost/config/workaround.hpp]. 1045]] 1046[[`BOOST_PREVENT_MACRO_SUBSTITUTION`][ 1047Sometimes you have a function name with the same name as a C macro, for example "min" and "max" 1048member functions, in which case one can prevent the function being expanded as a macro using: 1049`` 1050someclass.min BOOST_PREVENT_MACRO_SUBSTITUTION(arg1, arg2); 1051`` 1052The following also works in most, but not all, contexts: 1053`` 1054(someclass.max)(arg1, arg2); 1055`` 1056]] 1057[[`BOOST_DEDUCED_TYPENAME`][ 1058Some compilers don't support the use of typename for dependent types in deduced 1059contexts. This macro expands to nothing on those compilers, and typename 1060elsewhere. For example, replace: 1061`template <class T> void f(T, typename T::type);` 1062with: 1063`template <class T> void f(T, BOOST_DEDUCED_TYPENAME T::type);` 1064]] 1065[[`BOOST_HASH_MAP_HEADER`][ 1066The header to include to get the SGI `hash_map` class. This macro is only 1067available if `BOOST_HAS_HASH` is defined. 1068]] 1069[[`BOOST_HASH_SET_HEADER`][ 1070The header to include to get the SGI `hash_set` class. This macro is only 1071available if `BOOST_HAS_HASH` is defined. 1072]] 1073[[`BOOST_SLIST_HEADER`][ 1074The header to include to get the SGI `slist` class. This macro is only 1075available if `BOOST_HAS_SLIST` is defined. 1076]] 1077[[`BOOST_STD_EXTENSION_NAMESPACE`][ 1078The namespace used for std library extensions (hashtable classes etc). 1079]] 1080[[`BOOST_STATIC_CONSTANT(Type, assignment)`][ 1081On compilers which don't allow in-class initialization of static integral 1082constant members, we must use enums as a workaround if we want the constants 1083to be available at compile-time. This macro gives us a convenient way to 1084declare such constants. 1085For example instead of: 1086`` 1087struct foo{ 1088 static const int value = 2; 1089}; 1090`` 1091use: 1092`` 1093struct foo{ 1094 BOOST_STATIC_CONSTANT(int, value = 2); 1095}; 1096`` 1097]] 1098[[`BOOST_UNREACHABLE_RETURN(result)`][ 1099Normally evaluates to nothing, but evaluates to return x; if the compiler 1100requires a return, even when it can never be reached. 1101]] 1102[[`BOOST_FALLTHROUGH`][ 1103The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through 1104between switch labels: 1105`` 1106 switch (x) { 1107 case 40: 1108 case 41: 1109 if (truth_is_out_there) { 1110 ++x; 1111 BOOST_FALLTHROUGH; // Use instead of/along with annotations in 1112 // comments. 1113 } else { 1114 return x; 1115 } 1116 case 42: 1117 ... 1118`` 1119As shown in the example above, the BOOST_FALLTHROUGH macro should be 1120followed by a semicolon. It is designed to mimic control-flow statements 1121like 'break;', so it can be placed in most places where 'break;' can, but 1122only if there are no statements on the execution path between it and the 1123next switch label. 1124 1125When compiled with Clang >3.2 in C++11 mode, the BOOST_FALLTHROUGH macro is 1126expanded to `[[clang::fallthrough]]` attribute, which is analysed when 1127performing switch labels fall-through diagnostic ('-Wimplicit-fallthrough'). 1128See clang [@http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough 1129documentation on language extensions for details.] 1130 1131When used with unsupported compilers, the BOOST_FALLTHROUGH macro has no 1132effect on diagnostics. 1133 1134In either case this macro has no effect on runtime behavior and performance 1135of code. 1136]] 1137[[`BOOST_EXPLICIT_TEMPLATE_TYPE(t)` 1138 1139 `BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t,v)` 1140 1141 `BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t)` 1142 1143 `BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t,v)`][ 1144Some compilers silently "fold" different function template instantiations if 1145some of the template parameters don't appear in the function parameter list. 1146For instance: 1147`` 1148 #include <iostream> 1149 #include <ostream> 1150 #include <typeinfo> 1151 1152 template <int n> 1153 void f() { std::cout << n << ' '; } 1154 1155 template <typename T> 1156 void g() { std::cout << typeid(T).name() << ' '; } 1157 1158 int main() { 1159 f<1>(); 1160 f<2>(); 1161 1162 g<int>(); 1163 g<double>(); 1164 } 1165`` 1166incorrectly outputs [^2 2 double double] on VC++ 6. These macros, to be used 1167in the function parameter list, fix the problem without effects on the calling 1168syntax. For instance, in the case above write: 1169`` 1170 template <int n> 1171 void f(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, n)) { ... } 1172 1173 template <typename T> 1174 void g(BOOST_EXPLICIT_TEMPLATE_TYPE(T)) { ... } 1175`` 1176Beware that they can declare (for affected compilers) a dummy defaulted 1177parameter, so they 1178 1179[*a)] should be always invoked [*at the end] of the parameter list 1180 1181[*b)] can't be used if your function template is multiply declared. 1182 1183Furthermore, in order to add any needed comma separator, an `APPEND_*` version 1184must be used when the macro invocation appears after a normal parameter 1185declaration or after the invocation of another macro of this same group. 1186]] 1187[[`BOOST_USE_FACET(Type, loc)`][ 1188When the standard library does not have a conforming `std::use_facet` there 1189are various workarounds available, but they differ from library to library. 1190This macro provides a consistent way to access a locale's facets. For example, 1191replace: 1192`std::use_facet<Type>(loc);` 1193with: 1194`BOOST_USE_FACET(Type, loc);` 1195Note do not add a `std::` prefix to the front of `BOOST_USE_FACET`. 1196]] 1197[[`BOOST_HAS_FACET(Type, loc)`][ 1198When the standard library does not have a comforming `std::has_facet` there 1199are various workarounds available, but they differ from library to library. 1200This macro provides a consistent way to check a locale's facets. For example, 1201replace: 1202`std::has_facet<Type>(loc);` 1203with: 1204`BOOST_HAS_FACET(Type, loc);` 1205Note do not add a `std::` prefix to the front of `BOOST_HAS_FACET`. 1206]] 1207[[`BOOST_NESTED_TEMPLATE`][ 1208Member templates are supported by some compilers even though they can't use 1209the `A::template member<U>` syntax, as a workaround replace: 1210`typedef typename A::template rebind<U> binder;` 1211with: 1212`typedef typename A::BOOST_NESTED_TEMPLATE rebind<U> binder;` 1213]] 1214[[`BOOST_STRINGIZE(X)`][ 1215Converts the parameter `X` to a string after macro replacement on `X` has 1216been performed. 1217]] 1218[[`BOOST_JOIN(X,Y)`][ 1219This piece of macro magic joins the two arguments together, even when one of 1220the arguments is itself a macro (see 16.3.1 in C++ standard). This is normally 1221used to create a mangled name in combination with a predefined macro such a 1222\_\_LINE__. 1223]] 1224[[`BOOST_RESTRICT`][ 1225This macro can be used in place of the compiler specific variant of the C99 `restrict` keyword to 1226notify the compiler that, for the lifetime of the qualified pointer variable, only it and its 1227derivative value will be used to gain access to the object it references. This limits the effect of 1228pointer aliasing and helps the optimizers in generating better code. However, i this condition is 1229violated, undefined behavior may occurs. 1230 1231Usage example: 1232`` 1233 void perform_computation( float* BOOST_RESTRICT in, float* BOOST_RESTRICT out ) 1234 { 1235 *out = *in * 0.5f; 1236 } 1237`` 1238]] 1239[[`BOOST_FORCEINLINE`][ 1240This macro can be used in place of the `inline` keyword to instruct the compiler 1241that the function should always be inlined. 1242Overuse of this macro can lead to significant bloat, while good use can increase 1243performance in certain cases, such as computation-intensive code built through 1244generative programming techniques. 1245 1246Usage example: 1247`` 1248 template<class T> 1249 BOOST_FORCEINLINE T& f(T& t) 1250 { 1251 return t; 1252 } 1253`` 1254 1255Note that use of this macro can lead to cryptic error messages with some compilers. 1256Consider defining it to `inline` before including the Boost.Config header in order to be 1257able to debug errors more easily. 1258]] 1259[[`BOOST_NOINLINE`][ 1260This macro can be used in place of the `inline` keyword to instruct the compiler 1261that the function should never be inlined. One should typically use this macro 1262to mark functions that are unlikely to be called, such as error handling routines. 1263 1264Usage example: 1265`` 1266 BOOST_NOINLINE void handle_error(const char* descr) 1267 { 1268 // ... 1269 } 1270`` 1271]] 1272[[`BOOST_NORETURN`][ 1273This macro can be used before the function declaration or definition to instruct the compiler 1274that the function does not return normally (i.e. with a `return` statement or by leaving 1275the function scope, if the function return type is `void`). The macro can be used to mark 1276functions that always throw exceptions or terminate the application. Compilers that support 1277this markup may use this information to specifically organize the code surrounding calls to 1278this function and suppress warnings about missing `return` statements in the functions 1279enclosing such calls. 1280 1281Usage example: 1282`` 1283 BOOST_NORETURN void on_error_occurred(const char* descr) 1284 { 1285 throw std::runtime_error(descr); 1286 } 1287`` 1288 1289If the compiler does not support this markup, `BOOST_NORETURN` is defined empty and an 1290additional macro `BOOST_NO_NORETURN` is defined. 1291]] 1292[[`BOOST_LIKELY(X)` 1293 1294 `BOOST_UNLIKELY(X)`][ 1295These macros communicate to the compiler that the conditional expression `X` is likely 1296or unlikely to yield a positive result. The expression should result in a boolean value. 1297The result of the macro is an integer or boolean value equivalent to the result of `X`. 1298 1299The macros are intended to be used in branching statements. The additional hint they provide 1300can be used by the compiler to arrange the compiled code of the branches more effectively. 1301 1302Usage example: 1303`` 1304 if (BOOST_UNLIKELY(ptr == NULL)) 1305 handle_error("ptr is NULL"); 1306`` 1307]] 1308[[`BOOST_ATTRIBUTE_UNUSED`][Expands to `__attribute__((unused))` when this is available - 1309can be used to disable compiler warnings relating to unused types or variables.]] 1310[[`BOOST_ATTRIBUTE_NODISCARD`][Expands to `[[nodiscard]]` when this is available - 1311can be used to create a warning when a type or variable is unused.]] 1312[[`BOOST_ATTRIBUTE_NO_UNIQUE_ADDRESS`][Expands to `[[no_unique_address]]` when this is available - 1313can be used to indicate that a non-static data member need not have a unique address (for example empty classes).]] 1314[[`BOOST_MAY_ALIAS`, `BOOST_NO_MAY_ALIAS`][ 1315`BOOST_MAY_ALIAS` expands to a type attribute that can be used to mark types that may 1316alias other types. Pointers or references to such marked types can be used to access objects 1317of other types. If the compiler supports this feature `BOOST_NO_MAY_ALIAS` is not defined. 1318Otherwise `BOOST_MAY_ALIAS` expands to nothing and `BOOST_NO_MAY_ALIAS` is defined. 1319 1320Usage example: 1321`` 1322 struct BOOST_MAY_ALIAS aliasing_struct; 1323 typedef unsigned int BOOST_MAY_ALIAS aliasing_uint; 1324`` 1325]] 1326[[`BOOST_PRAGMA_MESSAGE(M)`][Defined in header `<boost/config/pragma_message.hpp>`, 1327this macro expands to the equivalent of `#pragma message(M)`. `M` must be a string 1328literal. 1329 1330Example: `BOOST_PRAGMA_MESSAGE("This header is deprecated.")` 1331 1332The messages issued by `BOOST_PRAGMA_MESSAGE` can be suppressed by defining the macro 1333`BOOST_DISABLE_PRAGMA_MESSAGE`.]] 1334 1335[[`BOOST_HEADER_DEPRECATED(A)`][Defined in header `<boost/config/header_deprecated.hpp>`, 1336this macro issues the message "This header is deprecated. Use `A` instead." via 1337`BOOST_PRAGMA_MESSAGE`. `A` must be a string literal. 1338 1339Example: `BOOST_HEADER_DEPRECATED("<boost/config/workaround.hpp>")` 1340 1341The messages issued by `BOOST_HEADER_DEPRECATED` can be suppressed by defining the macro 1342`BOOST_ALLOW_DEPRECATED_HEADERS`.]] 1343] 1344 1345[endsect] 1346 1347[#config_info_macros] 1348 1349[section Boost Informational Macros] 1350 1351The following macros describe boost features; these are, generally speaking 1352the only boost macros that should be tested in user code. 1353 1354[table 1355 1356[[Macro ][Header ][Description ]] 1357 1358[[`BOOST_VERSION`][`<boost/version.hpp>`][ 1359Describes the boost version number in XYYYZZ format such that: 1360`(BOOST_VERSION % 100)` is the sub-minor version, `((BOOST_VERSION / 100) % 1000)` 1361is the minor version, and `(BOOST_VERSION / 100000)` is the major version. 1362]] 1363[[`BOOST_NO_INT64_T`][`<boost/cstdint.hpp>` `<boost/stdint.h>`][ 1364Defined if there are no 64-bit integral types: `int64_t`, `uint64_t` etc. 1365]] 1366[[`BOOST_NO_INTEGRAL_INT64_T`][`<boost/cstdint.hpp>` `<boost/stdint.h>`][ 1367Defined if `int64_t` as defined by `<boost/cstdint.hpp>` is not usable in 1368integral constant expressions. 1369]] 1370[[`BOOST_MSVC`][`<boost/config.hpp>`][ 1371Defined if the compiler is really Microsoft Visual C++, as opposed to one 1372of the many other compilers that also define `_MSC_VER`. Has the same value as 1373_MSC_VER. 1374]] 1375[[`BOOST_MSVC_FULL_VER`][`<boost/config.hpp>`][ 1376Defined to a normalised 9 digit version of _MSC_FULL_VER (which sometimes only has 8 digits), 1377the macro has the form VVMMPPPPP where VV is the major version number, MM is the minor version number, and 1378PPPPP is the compiler build number. 1379]] 1380[[`BOOST_GCC`][`<boost/config.hpp>`][ 1381Defined if the compiler is really GCC, as opposed to one 1382of the many other compilers that also define `__GNUC__`. Has the value: 1383`__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__`. 1384]] 1385[[`BOOST_INTEL`][`<boost/config.hpp>`][ 1386Defined if the compiler is an Intel compiler, takes the same value as the 1387compiler version macro. 1388]] 1389[[`BOOST_CLANG`][`<boost/config.hpp>`][ 1390Defined to 1 if the compiler is the Clang compiler. 1391]] 1392[[`BOOST_BORLANDC`][`<boost/config.hpp>`][ 1393Defined to the value of __BORLANDC__ if the compiler is the Embarcadero 1394non-clang based compiler. 1395]] 1396[[`BOOST_CODEGEARC`][`<boost/config.hpp>`][ 1397Defined to the value of __CODEGEARC__ if the compiler is the Embarcadero 1398non-clang based compiler. 1399]] 1400[[`BOOST_EMBTC`][`<boost/config.hpp>`][ 1401Defined to the value of __CODEGEARC__ if the compiler is the Embarcadero 1402clang based compiler. 1403]] 1404[[`BOOST_WINDOWS`][`<boost/config.hpp>`][ 1405Defined if the Windows platform API is available. 1406]] 1407[[`BOOST_DINKUMWARE_STDLIB`][`<boost/config.hpp>`][ 1408Defined if the dinkumware standard library is in use, takes the same value 1409as the Dinkumware library version macro `_CPPLIB_VER` if defined, otherwise 1. 1410]] 1411[[`BOOST_NO_WREGEX`][`<boost/regex.hpp>`][ 1412Defined if the regex library does not support wide character regular 1413expressions. 1414]] 1415[[`BOOST_COMPILER`][`<boost/config.hpp>`][ 1416Defined as a string describing the name and version number of the compiler 1417in use. Mainly for debugging the configuration. 1418]] 1419[[`BOOST_STDLIB`][`<boost/config.hpp>`][ 1420Defined as a string describing the name and version number of the standard 1421library in use. Mainly for debugging the configuration. 1422]] 1423[[`BOOST_PLATFORM`][`<boost/config.hpp>`][ 1424Defined as a string describing the name of the platform. Mainly for debugging 1425the configuration. 1426]] 1427[[`BOOST_LIBSTDCXX_VERSION`][`<boost/config.hpp>`][ 1428Defined if the libstdc++ standard library is in use. 1429Has the value of normalised 5 digit integer of the form VVMMM where 1430VV is the major version number, MM is the minor version number. 1431]] 1432] 1433 1434[endsect] 1435 1436[#deprecated_macros] 1437 1438[section Boost Deprecated Macros] 1439 1440The following have been deprecated; please use the replacements instead. 1441They will be removed in a future version of boost. 1442 1443[table 1444 1445[[Deprecated Macro][Replacement][When deprecated][When removed]] 1446 1447[[`BOOST_NO_0X_HDR_ARRAY`][`BOOST_NO_CXX11_HDR_ARRAY`][Boost 1.50][]] 1448[[`BOOST_NO_0X_HDR_CHRONO`][`BOOST_NO_CXX11_HDR_CHRONO`][Boost 1.50][]] 1449[[`BOOST_NO_0X_HDR_CODECVT`][`BOOST_NO_CXX11_HDR_CODECVT`][Boost 1.50][]] 1450[[`BOOST_NO_0X_HDR_CONDITION_VARIABLE`][`BOOST_NO_CXX11_HDR_CONDITION_VARIABLE`][Boost 1.50][]] 1451[[`BOOST_NO_0X_HDR_FORWARD_LIST`][`BOOST_NO_CXX11_HDR_FORWARD_LIST`][Boost 1.50][]] 1452[[`BOOST_NO_0X_HDR_FUTURE`][`BOOST_NO_CXX11_HDR_FUTURE`][Boost 1.50][]] 1453[[`BOOST_NO_0X_HDR_INITIALIZER_LIST`][`BOOST_NO_CXX11_HDR_INITIALIZER_LIST`][Boost 1.50][]] 1454[[`BOOST_NO_INITIALIZER_LISTS`][`BOOST_NO_CXX11_HDR_INITIALIZER_LIST`][Boost 1.50][]] 1455[[`BOOST_NO_0X_HDR_MUTEX`][`BOOST_NO_CXX11_HDR_MUTEX`][Boost 1.50][]] 1456[[`BOOST_NO_0X_HDR_RANDOM`][`BOOST_NO_CXX11_HDR_RANDOM`][Boost 1.50][]] 1457[[`BOOST_NO_0X_HDR_RATIO`][`BOOST_NO_CXX11_HDR_RATIO`][Boost 1.50][]] 1458[[`BOOST_NO_0X_HDR_REGEX`][`BOOST_NO_CXX11_HDR_REGEX`][Boost 1.50][]] 1459[[`BOOST_NO_0X_HDR_SYSTEM_ERROR`][`BOOST_NO_CXX11_HDR_SYSTEM_ERROR`][Boost 1.50][]] 1460[[`BOOST_NO_0X_HDR_THREAD`][`BOOST_NO_CXX11_HDR_THREAD`][Boost 1.50][]] 1461[[`BOOST_NO_0X_HDR_TUPLE`][`BOOST_NO_CXX11_HDR_TUPLE`][Boost 1.50][]] 1462[[`BOOST_NO_0X_HDR_TYPE_TRAITS`][`BOOST_NO_CXX11_HDR_TYPE_TRAITS`][Boost 1.50][]] 1463[[`BOOST_NO_0X_HDR_TYPEINDEX`][`BOOST_NO_CXX11_HDR_TYPEINDEX`][Boost 1.50][]] 1464[[`BOOST_NO_0X_HDR_UNORDERED_SET`][`BOOST_NO_CXX11_HDR_UNORDERED_SET`][Boost 1.50][]] 1465[[`BOOST_NO_0X_HDR_UNORDERED_MAP`][`BOOST_NO_CXX11_HDR_UNORDERED_MAP`][Boost 1.50][]] 1466[[`BOOST_NO_STD_UNORDERED`][`BOOST_NO_CXX11_HDR_UNORDERED_SET`][Boost 1.50][]] 1467[[][][][]] 1468[[`BOOST_NO_AUTO_DECLARATIONS`][`BOOST_NO_CXX11_AUTO_DECLARATIONS`][Boost 1.51][]] 1469[[`BOOST_NO_AUTO_MULTIDECLARATIONS`][`BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS`][Boost 1.51][]] 1470[[`BOOST_NO_CHAR16_T`][`BOOST_NO_CXX11_CHAR16_T`][Boost 1.51][]] 1471[[`BOOST_NO_CHAR32_T`][`BOOST_NO_CXX11_CHAR32_T`][Boost 1.51][]] 1472[[`BOOST_NO_TEMPLATE_ALIASES`][`BOOST_NO_CXX11_TEMPLATE_ALIASES`][Boost 1.51][]] 1473[[`BOOST_NO_CONSTEXPR`][`BOOST_NO_CXX11_CONSTEXPR`][Boost 1.51][]] 1474[[`BOOST_NO_DECLTYPE`][`BOOST_NO_CXX11_DECLTYPE`][Boost 1.51][]] 1475[[`BOOST_NO_DECLTYPE_N3276`][`BOOST_NO_CXX11_DECLTYPE_N3276`][Boost 1.51][]] 1476[[`BOOST_NO_DEFAULTED_FUNCTIONS`][`BOOST_NO_CXX11_DEFAULTED_FUNCTIONS`][Boost 1.51][]] 1477[[`BOOST_NO_DELETED_FUNCTIONS`][`BOOST_NO_CXX11_DELETED_FUNCTIONS`][Boost 1.51][]] 1478[[`BOOST_NO_EXPLICIT_CONVERSION_OPERATORS`][`BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS`][Boost 1.51][]] 1479[[`BOOST_NO_EXTERN_TEMPLATE`][`BOOST_NO_CXX11_EXTERN_TEMPLATE`][Boost 1.51][]] 1480[[`BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS`][`BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS`][Boost 1.51][]] 1481[[`BOOST_NO_LAMBDAS`][`BOOST_NO_CXX11_LAMBDAS`][Boost 1.51][]] 1482[[`BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS`][`BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS`][Boost 1.51][]] 1483[[`BOOST_NO_NOEXCEPT`][`BOOST_NO_CXX11_NOEXCEPT`][Boost 1.51][]] 1484[[`BOOST_NO_NULLPTR`][`BOOST_NO_CXX11_NULLPTR`][Boost 1.51][]] 1485[[`BOOST_NO_RAW_LITERALS`][`BOOST_NO_CXX11_RAW_LITERALS`][Boost 1.51][]] 1486[[`BOOST_NO_RVALUE_REFERENCES`][`BOOST_NO_CXX11_RVALUE_REFERENCES`][Boost 1.51][]] 1487[[`BOOST_NO_SCOPED_ENUMS`][`BOOST_NO_CXX11_SCOPED_ENUMS`][Boost 1.51][]] 1488[[`BOOST_NO_STATIC_ASSERT`][`BOOST_NO_CXX11_STATIC_ASSERT`][Boost 1.51][]] 1489[[`BOOST_NO_STD_UNORDERED`][`BOOST_NO_CXX11_STD_UNORDERED`][Boost 1.51][]] 1490[[`BOOST_NO_UNICODE_LITERALS`][`BOOST_NO_CXX11_UNICODE_LITERALS`][Boost 1.51][]] 1491[[`BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX`][`BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX`][Boost 1.51][]] 1492[[`BOOST_NO_VARIADIC_TEMPLATES`][`BOOST_NO_CXX11_VARIADIC_TEMPLATES`][Boost 1.51][]] 1493[[`BOOST_NO_VARIADIC_MACROS`][`BOOST_NO_CXX11_VARIADIC_MACROS`][Boost 1.51][]] 1494[[`BOOST_NO_NUMERIC_LIMITS_LOWEST`][`BOOST_NO_CXX11_NUMERIC_LIMITS`][Boost 1.51][]] 1495[[][][][]] 1496[[`BOOST_HAS_STATIC_ASSERT`][`BOOST_NO_CXX11_STATIC_ASSERT` (negated)][Boost 1.53][]] 1497[[`BOOST_HAS_VARIADIC_TMPL`][`BOOST_NO_CXX11_VARIADIC_TEMPLATES` (negated)][Boost 1.53][]] 1498[[`BOOST_HAS_RVALUE_REFS`][`BOOST_NO_CXX11_RVALUE_REFERENCES` (negated)][Boost 1.53][]] 1499[[`BOOST_HAS_CHAR16_T`][`BOOST_NO_CXX11_CHAR16_T` (negated)][Boost 1.53][]] 1500[[`BOOST_HAS_CHAR32_T`][`BOOST_NO_CXX11_CHAR32_T` (negated)][Boost 1.53][]] 1501] 1502 1503[endsect] 1504 1505[section Macros for libraries with separate source code] 1506 1507The following macros and helper headers are of use to authors whose libraries 1508include separate source code, and are intended to address several issues: 1509 1510* Controlling shared library symbol visibility 1511* Fixing the ABI of the compiled library 1512* Selecting which compiled library to link against based upon the compilers settings 1513 1514See [@http://www.boost.org/development/separate_compilation.html Guidelines for Authors of Boost Libraries Containing Separate Source] 1515 1516[section Macros controlling shared library symbol visibility] 1517 1518Some compilers support C++ extensions that control which symbols 1519will be exported from shared libraries such as dynamic shared objects (DSO's) on Unix-like 1520systems or dynamic-link libraries (DLL's) on Windows. 1521 1522The Microsoft VC++ compiler has long supplied 1523`__declspec(dllexport)` and `__declspec(dllimport)` extensions for this purpose, 1524as do virtually all other compilers targeting the Windows platform. 1525 1526Modern versions of the GNU GCC compiler provide the `__attribute__((visibility("default")))` 1527extension to indicate that a symbol should be exported. All other symbols may be hidden by using the 1528`-fvisibility-hidden` or `-fvisibility-ms-compat` compiler switches. 1529 1530Boost supplies several macros to make it easier to manage symbol visibility in a way that 1531is portable between compilers and operating systems. 1532 1533[table 1534[[Macro ][Description ]] 1535[[`BOOST_SYMBOL_EXPORT`][ 1536Defines the syntax of a C++ language extension that indicates a symbol is to be exported from a shared library. 1537If the compiler has no such extension, the macro is defined with no replacement text. 1538]] 1539[[`BOOST_SYMBOL_IMPORT`][ 1540Defines the syntax of a C++ language extension that indicates a symbol is to be imported from a shared library. 1541If the compiler has no such extension, the macro is defined with no replacement text. 1542]] 1543[[`BOOST_SYMBOL_VISIBLE`][ 1544Defines the syntax of a C++ language extension that indicates a symbol is to be globally visible. 1545If the compiler has no such extension, the macro is defined with no replacement text. 1546Needed for classes that are not otherwise exported, but are used by RTTI. Examples include 1547class for objects that will be thrown as exceptions or used in dynamic_casts, 1548across shared library boundaries. For example, a header-only exception class might look like this: 1549`` 1550 class BOOST_SYMBOL_VISIBLE my_exception : public std::runtime_error { ... }; 1551`` 1552Without BOOST_SYMBOL_VISIBLE, it would be impossible to catch my_exception thrown from a shared library 1553compiled by GCC with the -fvisibility=hidden option. 1554]] 1555[[`BOOST_HAS_DECLSPEC`][ 1556The compiler has C++ extensions `__declspec(dllexport)` and `__declspec(dllimport)` to control 1557export/import of symbols from shared libraries. 1558['Deprecated. This macro is no longer necessary since BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT 1559are now supplied. It is provided to support legacy code.] 1560]] 1561] 1562 1563Typical usage: 1564 1565[*boost/foo/config.hpp] 1566 1567 ... 1568 #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FOO_DYN_LINK) 1569 # if defined(BOOST_FOO_SOURCE) 1570 # define BOOST_FOO_DECL BOOST_SYMBOL_EXPORT 1571 # else 1572 # define BOOST_FOO_DECL BOOST_SYMBOL_IMPORT 1573 # endif 1574 #else 1575 # define BOOST_FOO_DECL 1576 #endif 1577 ... 1578 1579[*boost/foo/foo.hpp] 1580 1581 #include <boost/foo/config.hpp> 1582 ... 1583 class BOOST_FOO_DECL bar { ... }; 1584 ... 1585 void BOOST_FOO_DECL f(); 1586 ... 1587 1588[*boost/libs/foo/src/foo.cpp] 1589 1590 #define BOOST_FOO_SOURCE 1591 #include <boost/foo/foo.hpp> 1592 ... 1593 void BOOST_FOO_DECL f() 1594 { 1595 ... 1596 } 1597 ... 1598 1599[endsect] 1600 1601[section ABI Fixing] 1602 1603When linking against a pre-compiled library it vital that the ABI used by the 1604compiler when building the library ['matches exactly] the ABI used by the code 1605using the library. In this case ABI means things like the struct packing 1606arrangement used, the name mangling scheme used, or the size of some types 1607(enum types for example). This is separate from things like threading support, 1608or runtime library variations, which have to be dealt with by build variants. 1609To put this in perspective there is one compiler (Borland's) that has so many 1610compiler options that make subtle changes to the ABI, that at least in theory 1611there 3200 combinations, and that's without considering runtime library 1612variations. Fortunately these variations can be managed by `#pragma`'s that 1613tell the compiler what ABI to use for the types declared in your library. 1614In order to avoid sprinkling `#pragma`'s all over the boost headers, there are 1615some prefix and suffix headers that do the job. Typical usage is: 1616 1617[*my_library.hpp] 1618 1619 #ifndef MY_INCLUDE_GUARD 1620 #define MY_INCLUDE_GUARD 1621 1622 // all includes go here: 1623 ``[^[*#include <boost/config.hpp>]]`` 1624 #include <whatever> 1625 1626 ``[^[*#include <boost/config/abi_prefix.hpp>]]`` // must be the last #include 1627 1628 namespace boost { 1629 1630 // your code goes here 1631 1632 } 1633 1634 ``[^[*#include <boost/config/abi_suffix.hpp>]]`` // pops abi_prefix.hpp pragmas 1635 1636 #endif // include guard 1637 1638[*my_library.cpp] 1639 1640 ... 1641 // nothing special need be done in the implementation file 1642 ... 1643 1644The user can disable this mechanism by defining `BOOST_DISABLE_ABI_HEADERS`, or 1645they can define `BOOST_ABI_PREFIX` and/or `BOOST_ABI_SUFFIX` to point to their 1646own prefix/suffix headers if they so wish. 1647 1648[endsect] 1649 1650[section Automatic library selection] 1651 1652It is essential that users link to a build of a library which was built against 1653the same runtime library that their application will be built against -if this 1654does not happen then the library will not be binary compatible with their own 1655code- and there is a high likelihood that their application will experience 1656runtime crashes. These kinds of problems can be extremely time consuming and 1657difficult to debug, and often lead to frustrated users and authors alike (simply 1658selecting the right library to link against is not as easy as it seems when 1659their are 6-8 of them to chose from, and some users seem to be blissfully 1660unaware that there even are different runtimes available to them). 1661 1662To solve this issue, some compilers allow source code to contain `#pragma`'s that 1663instruct the linker which library to link against, all the user need do is 1664include the headers they need, place the compiled libraries in their library 1665search path, and the compiler and linker do the rest. Boost.config supports 1666this via the header `<boost/config/auto_link.hpp>`, before including this header 1667one or more of the following macros need to be defined: 1668 1669[variablelist 1670[[`BOOST_LIB_NAME`][ 1671Required: An identifier containing the basename of the library, for 1672example 'boost_regex'. 1673]] 1674[[`BOOST_DYN_LINK`][ 1675Optional: when set link to dll rather than static library. 1676]] 1677[[`BOOST_LIB_DIAGNOSTIC`][ 1678Optional: when set the header will print out the name of the library selected 1679(useful for debugging). 1680]] 1681[[`BOOST_AUTO_LINK_NOMANGLE`][ 1682Optional: whan set specifies that we should link to BOOST_LIB_NAME.lib, rather than a mangled-name version.]] 1683[[`BOOST_AUTO_LINK_TAGGED`][Optional: Specifies that we link to libraries built with the --layout=tagged option. 1684 This is essentially the same as the default name-mangled version, but without 1685 the compiler name and version, or the Boost version. Just the build options.]] 1686[[`BOOST_AUTO_LINK_SYSTEM`][Optional: Specifies that we link to libraries built with the --layout=system option. 1687 This is essentially the same as the non-name-mangled version, but with 1688 the prefix to differentiate static and dll builds]] 1689] 1690 1691If the compiler supports this mechanism, then it will be told to link against 1692the appropriately named library, the actual algorithm used to mangle the name 1693of the library is documented inside `<boost/config/auto_link.hpp>` and has to 1694match that used to create the libraries via bjam 's install rules. 1695 1696 1697[*my_library.hpp] 1698 1699 ... 1700 // 1701 // Don't include auto-linking code if the user has disabled it by 1702 // defining BOOST_ALL_NO_LIB, or BOOST_MY_LIBRARY_NO_LIB, or if this 1703 // is one of our own source files (signified by BOOST_MY_LIBRARY_SOURCE): 1704 // 1705 #if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_MY_LIBRARY_NO_LIB) && !defined(BOOST_MY_LIBRARY_SOURCE) 1706 # define BOOST_LIB_NAME boost_my_library 1707 # ifdef BOOST_MY_LIBRARY_DYN_LINK 1708 # define BOOST_DYN_LINK 1709 # endif 1710 # include <boost/config/auto_link.hpp> 1711 #endif 1712 ... 1713 1714[*my_library.cpp] 1715 1716 // define BOOST_MY_LIBRARY_SOURCE so that the header knows that the 1717 // library is being built (possibly exporting rather than importing code) 1718 // 1719 #define BOOST_MY_LIBRARY_SOURCE 1720 1721 #include <boost/my_library/my_library.hpp> 1722 ... 1723 1724[endsect] 1725 1726[endsect] 1727 1728[endsect] 1729 1730 1731 1732