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