blob: f44340dd61ac519b0d25a66d6cacc5949b9b1fd2 [file] [log] [blame]
Brian Silverman9d8fa392018-08-04 17:09:24 -07001[/
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_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
670pass local classes as template parameters (this macro intentionally does not
671control 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
675defaulted (`= default`) functions in access control sections other than `public`. Public defaulted
676functions may still be supported, as indicated by `BOOST_NO_CXX11_DEFAULTED_FUNCTIONS`. Some
677compilers 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
685not support the C++11 version of `numeric_limits`.
686]]
687[[`BOOST_NO_CXX11_POINTER_TRAITS`][The standard library does not provide a
688C++11 version of `std::pointer_traits` in <memory>.]]
689[[`BOOST_NO_CXX11_RANGE_BASED_FOR`][The compiler does not support
690range-based for statements.
691]]
692[[`BOOST_NO_CXX11_RAW_LITERALS`][The compiler does not support
693raw string literals.
694]]
695[[`BOOST_NO_CXX11_REF_QUALIFIERS`][The compiler does not support
696ref-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
700r-value references.
701]]
702[[`BOOST_NO_CXX11_SCOPED_ENUMS`][The compiler does not support
703scoped enumerations (`enum class`).
704]]
705[[`BOOST_NO_CXX11_SFINAE_EXPR`][The compiler does not support
706usage of C++11 SFINAE with arbitrary expressions. Use this macro only if you
707are using all of the features of SFINAE including substitution-failure-on-private-member-access.
708Otherwise 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
723specification syntax (e.g. `auto foo(T) -> T;`).]]
724[[`BOOST_NO_CXX11_UNICODE_LITERALS`][The compiler does not support
725Unicode (`u8`, `u`, `U`) literals.
726]]
727[[`BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX`][The compiler does not support
728the [@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
733variadic templates.
734]]
735[[`BOOST_NO_CXX11_VARIADIC_MACROS`][The compiler does not support
736variadic 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
748The following macros allow use of C++11 features even with compilers that do not yet
749provide compliant C++11 support.
750
751[table
752[[Macro ][ Description ]]
753
754[[`BOOST_ALIGNMENT(X)`, `BOOST_NO_ALIGNMENT`][
755Some 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)`
757keyword if the compiler supports it or to some compiler-specific attribute to achieve the specified alignment.
758If 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.
760The 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`][
770Some compilers don't support the use of `constexpr`. This macro expands to nothing on those compilers, and `constexpr`
771elsewhere. For example, when defining a constexpr function or constructor replace:
772``
773 constexpr tuple();
774``
775with:
776``
777 BOOST_CONSTEXPR tuple();
778``
779]]
780[[`BOOST_CONSTEXPR_OR_CONST`][
781Some compilers don't support the use of `constexpr`. This macro expands to `const` on those compilers, and `constexpr`
782elsewhere. For example, when defining const expr variables replace:
783``
784 static constexpr UIntType xor_mask = a;
785``
786with:
787``
788 static BOOST_CONSTEXPR_OR_CONST UIntType xor_mask = a;
789``
790]]
791[[`BOOST_STATIC_CONSTEXPR`][
792This 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``
796with:
797``
798 BOOST_STATIC_CONSTEXPR UIntType xor_mask = a;
799``
800]]
801[[`BOOST_DEFAULTED_FUNCTION(fun, body)`][
802This macro is intended to be used within a class definition in order to declare a default implementation of function `fun`.
803For the compilers that do not support C++11 defaulted functions the macro will expand into an inline function definition
804with the `body` implementation. For example:
805``
806 struct my_struct
807 {
808 BOOST_DEFAULTED_FUNCTION(my_struct(), {})
809 };
810``
811is equivalent to:
812``
813 struct my_struct
814 {
815 my_struct() = default;
816 };
817``
818or:
819``
820 struct my_struct
821 {
822 my_struct() {}
823 };
824``
825]]
826[[`BOOST_DELETED_FUNCTION(fun)`][
827This macro is intended to be used within a class definition in order to declare a deleted function `fun`.
828For the compilers that do not support C++11 deleted functions the macro will expand into a private function
829declaration with no definition. Since the macro may change the access mode, it is recommended to use this macro
830at 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``
838is equivalent to:
839``
840 struct noncopyable
841 {
842 noncopyable(noncopyable const&) = delete;
843 noncopyable& operator= (noncopyable const&) = delete;
844 };
845``
846or:
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][
864If `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]
873If `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`][
884For Microsoft Visual C++ 2012, enable the C++11 features supplied by the
885November 2012 Community Technology Preview. These features are not automatically
886enabled because the CTP is non-supported alpha code that is not recommended
887for production use. This macro must be defined before including any Boost headers,
888and must be defined for all translation units in the program, including Boost library builds.
889This macro will no longer have any effect once an official Microsoft
890release supports the CTP features.
891]]
892]
893
894[endsect]
895
896[section Macros that describe C++14 features not supported]
897
898The following macros describe features in the 2014 ISO C++ standard, formerly known as C++0y,
899that 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``
906struct Foo
907{
908 int x, y = 42;
909};
910
911Foo 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
933The following macros allow use of C++14 features even with compilers that do not yet
934provide 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
945The following macros describe features in the 2017 ISO C++ standard, formerly known as C++1z,
946that 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
960The 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
976The following macros are either simple helpers, or macros that provide
977workarounds for compiler/standard library defects.
978
979
980[table
981[[Macro ][Description ]]
982
983[[`BOOST_WORKAROUND`][
984This macro is used where a compiler specific workaround is required that is not otherwise
985described by one of the other Boost.Config macros. To use the macro you must first
986``
987#include <boost/config/workaround.hpp>
988``
989usage 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``
997where `MACRONAME` is a macro that usually describes the version number to be tested against, and `CONDITION`
998is a comparison operator followed by a value. For example `BOOST_WORKAROUND(BOOST_INTEL, <= 1010)` would
999evaluate to `1` for Intel C++ 10.1 and earlier.
1000
1001The macro can also be used with `BOOST_TESTED_AT` if all
1002current compiler versions exhibit the issue, but the issue is expected to be fixed at some later point.
1003
1004For example
1005`BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x590))` would normally evaluate to `1` for all values
1006of `__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`][
1012Sometimes you have a function name with the same name as a C macro, for example "min" and "max"
1013member functions, in which case one can prevent the function being expanded as a macro using:
1014``
1015someclass.min BOOST_PREVENT_MACRO_SUBSTITUTION(arg1, arg2);
1016``
1017The following also works in most, but not all, contexts:
1018``
1019(someclass.max)(arg1, arg2);
1020``
1021]]
1022[[`BOOST_DEDUCED_TYPENAME`][
1023Some compilers don't support the use of typename for dependent types in deduced
1024contexts. This macro expands to nothing on those compilers, and typename
1025elsewhere. For example, replace:
1026`template <class T> void f(T, typename T::type);`
1027with:
1028`template <class T> void f(T, BOOST_DEDUCED_TYPENAME T::type);`
1029]]
1030[[`BOOST_HASH_MAP_HEADER`][
1031The header to include to get the SGI `hash_map` class. This macro is only
1032available if `BOOST_HAS_HASH` is defined.
1033]]
1034[[`BOOST_HASH_SET_HEADER`][
1035The header to include to get the SGI `hash_set` class. This macro is only
1036available if `BOOST_HAS_HASH` is defined.
1037]]
1038[[`BOOST_SLIST_HEADER`][
1039The header to include to get the SGI `slist` class. This macro is only
1040available if `BOOST_HAS_SLIST` is defined.
1041]]
1042[[`BOOST_STD_EXTENSION_NAMESPACE`][
1043The namespace used for std library extensions (hashtable classes etc).
1044]]
1045[[`BOOST_STATIC_CONSTANT(Type, assignment)`][
1046On compilers which don't allow in-class initialization of static integral
1047constant members, we must use enums as a workaround if we want the constants
1048to be available at compile-time. This macro gives us a convenient way to
1049declare such constants.
1050For example instead of:
1051``
1052struct foo{
1053 static const int value = 2;
1054};
1055``
1056use:
1057``
1058struct foo{
1059 BOOST_STATIC_CONSTANT(int, value = 2);
1060};
1061``
1062]]
1063[[`BOOST_UNREACHABLE_RETURN(result)`][
1064Normally evaluates to nothing, but evaluates to return x; if the compiler
1065requires a return, even when it can never be reached.
1066]]
1067[[`BOOST_FALLTHROUGH`][
1068The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
1069between 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``
1084As shown in the example above, the BOOST_FALLTHROUGH macro should be
1085followed by a semicolon. It is designed to mimic control-flow statements
1086like 'break;', so it can be placed in most places where 'break;' can, but
1087only if there are no statements on the execution path between it and the
1088next switch label.
1089
1090When compiled with Clang >3.2 in C++11 mode, the BOOST_FALLTHROUGH macro is
1091expanded to `[[clang::fallthrough]]` attribute, which is analysed when
1092performing switch labels fall-through diagnostic ('-Wimplicit-fallthrough').
1093See clang [@http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough
1094documentation on language extensions for details.]
1095
1096When used with unsupported compilers, the BOOST_FALLTHROUGH macro has no
1097effect on diagnostics.
1098
1099In either case this macro has no effect on runtime behavior and performance
1100of 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)`][
1109Some compilers silently "fold" different function template instantiations if
1110some of the template parameters don't appear in the function parameter list.
1111For 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``
1131incorrectly outputs [^2 2 double double] on VC++ 6. These macros, to be used
1132in the function parameter list, fix the problem without effects on the calling
1133syntax. 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``
1141Beware that they can declare (for affected compilers) a dummy defaulted
1142parameter, 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
1148Furthermore, in order to add any needed comma separator, an `APPEND_*` version
1149must be used when the macro invocation appears after a normal parameter
1150declaration or after the invocation of another macro of this same group.
1151]]
1152[[`BOOST_USE_FACET(Type, loc)`][
1153When the standard library does not have a conforming `std::use_facet` there
1154are various workarounds available, but they differ from library to library.
1155This macro provides a consistent way to access a locale's facets. For example,
1156replace:
1157`std::use_facet<Type>(loc);`
1158with:
1159`BOOST_USE_FACET(Type, loc);`
1160Note do not add a `std::` prefix to the front of `BOOST_USE_FACET`.
1161]]
1162[[`BOOST_HAS_FACET(Type, loc)`][
1163When the standard library does not have a comforming `std::has_facet` there
1164are various workarounds available, but they differ from library to library.
1165This macro provides a consistent way to check a locale's facets. For example,
1166replace:
1167`std::has_facet<Type>(loc);`
1168with:
1169`BOOST_HAS_FACET(Type, loc);`
1170Note do not add a `std::` prefix to the front of `BOOST_HAS_FACET`.
1171]]
1172[[`BOOST_NESTED_TEMPLATE`][
1173Member templates are supported by some compilers even though they can't use
1174the `A::template member<U>` syntax, as a workaround replace:
1175`typedef typename A::template rebind<U> binder;`
1176with:
1177`typedef typename A::BOOST_NESTED_TEMPLATE rebind<U> binder;`
1178]]
1179[[`BOOST_STRINGIZE(X)`][
1180Converts the parameter `X` to a string after macro replacement on `X` has
1181been performed.
1182]]
1183[[`BOOST_JOIN(X,Y)`][
1184This piece of macro magic joins the two arguments together, even when one of
1185the arguments is itself a macro (see 16.3.1 in C++ standard). This is normally
1186used to create a mangled name in combination with a predefined macro such a
1187\_\_LINE__.
1188]]
1189[[`BOOST_RESTRICT`][
1190This macro can be used in place of the compiler specific variant of the C99 `restrict` keyword to
1191notify the compiler that, for the lifetime of the qualified pointer variable, only it and its
1192derivative value will be used to gain access to the object it references. This limits the effect of
1193pointer aliasing and helps the optimizers in generating better code. However, i this condition is
1194violated, undefined behavior may occurs.
1195
1196Usage 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`][
1205This macro can be used in place of the `inline` keyword to instruct the compiler
1206that the function should always be inlined.
1207Overuse of this macro can lead to significant bloat, while good use can increase
1208performance in certain cases, such as computation-intensive code built through
1209generative programming techniques.
1210
1211Usage example:
1212``
1213 template<class T>
1214 BOOST_FORCEINLINE T& f(T& t)
1215 {
1216 return t;
1217 }
1218``
1219
1220Note that use of this macro can lead to cryptic error messages with some compilers.
1221Consider defining it to `inline` before including the Boost.Config header in order to be
1222able to debug errors more easily.
1223]]
1224[[`BOOST_NOINLINE`][
1225This macro can be used in place of the `inline` keyword to instruct the compiler
1226that the function should never be inlined. One should typically use this macro
1227to mark functions that are unlikely to be called, such as error handling routines.
1228
1229Usage example:
1230``
1231 BOOST_NOINLINE void handle_error(const char* descr)
1232 {
1233 // ...
1234 }
1235``
1236]]
1237[[`BOOST_NORETURN`][
1238This macro can be used before the function declaration or definition to instruct the compiler
1239that the function does not return normally (i.e. with a `return` statement or by leaving
1240the function scope, if the function return type is `void`). The macro can be used to mark
1241functions that always throw exceptions or terminate the application. Compilers that support
1242this markup may use this information to specifically organize the code surrounding calls to
1243this function and suppress warnings about missing `return` statements in the functions
1244enclosing such calls.
1245
1246Usage example:
1247``
1248 BOOST_NORETURN void on_error_occurred(const char* descr)
1249 {
1250 throw std::runtime_error(descr);
1251 }
1252``
1253
1254If the compiler does not support this markup, `BOOST_NORETURN` is defined empty and an
1255additional macro `BOOST_NO_NORETURN` is defined.
1256]]
1257[[`BOOST_LIKELY(X)`
1258
1259 `BOOST_UNLIKELY(X)`][
1260These macros communicate to the compiler that the conditional expression `X` is likely
1261or unlikely to yield a positive result. The expression should result in a boolean value.
1262The result of the macro is an integer or boolean value equivalent to the result of `X`.
1263
1264The macros are intended to be used in branching statements. The additional hint they provide
1265can be used by the compiler to arrange the compiled code of the branches more effectively.
1266
1267Usage 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 -
1274can 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
1277alias other types. Pointers or references to such marked types can be used to access objects
1278of other types. If the compiler supports this feature `BOOST_NO_MAY_ALIAS` is not defined.
1279Otherwise `BOOST_MAY_ALIAS` expands to nothing and `BOOST_NO_MAY_ALIAS` is defined.
1280
1281Usage 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>`,
1288this macro expands to the equivalent of `#pragma message(M)`. `M` must be a string
1289literal.
1290
1291Example: `BOOST_PRAGMA_MESSAGE("This header is deprecated.")`
1292
1293The 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>`,
1297this macro issues the message "This header is deprecated. Use `A` instead." via
1298`BOOST_PRAGMA_MESSAGE`. `A` must be a string literal.
1299
1300Example: `BOOST_HEADER_DEPRECATED("<boost/config/workaround.hpp>")`
1301
1302The 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
1312The following macros describe boost features; these are, generally speaking
1313the 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>`][
1320Describes the boost version number in XYYYZZ format such that:
1321`(BOOST_VERSION % 100)` is the sub-minor version, `((BOOST_VERSION / 100) % 1000)`
1322is the minor version, and `(BOOST_VERSION / 100000)` is the major version.
1323]]
1324[[`BOOST_NO_INT64_T`][`<boost/cstdint.hpp>` `<boost/stdint.h>`][
1325Defined 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>`][
1328Defined if `int64_t` as defined by `<boost/cstdint.hpp>` is not usable in
1329integral constant expressions.
1330]]
1331[[`BOOST_MSVC`][`<boost/config.hpp>`][
1332Defined if the compiler is really Microsoft Visual C++, as opposed to one
1333of 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>`][
1337Defined to a normalised 9 digit version of _MSC_FULL_VER (which sometimes only has 8 digits),
1338the macro has the form VVMMPPPPP where VV is the major version number, MM is the minor version number, and
1339PPPPP is the compiler build number.
1340]]
1341[[`BOOST_GCC`][`<boost/config.hpp>`][
1342Defined if the compiler is really GCC, as opposed to one
1343of 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>`][
1347Defined if the compiler is an Intel compiler, takes the same value as the
1348compiler version macro.
1349]]
1350[[`BOOST_CLANG`][`<boost/config.hpp>`][
1351Defined to 1 if the compiler is the Clang compiler.
1352]]
1353[[`BOOST_WINDOWS`][`<boost/config.hpp>`][
1354Defined if the Windows platform API is available.
1355]]
1356[[`BOOST_DINKUMWARE_STDLIB`][`<boost/config.hpp>`][
1357Defined if the dinkumware standard library is in use, takes the same value
1358as the Dinkumware library version macro `_CPPLIB_VER` if defined, otherwise 1.
1359]]
1360[[`BOOST_NO_WREGEX`][`<boost/regex.hpp>`][
1361Defined if the regex library does not support wide character regular
1362expressions.
1363]]
1364[[`BOOST_COMPILER`][`<boost/config.hpp>`][
1365Defined as a string describing the name and version number of the compiler
1366in use. Mainly for debugging the configuration.
1367]]
1368[[`BOOST_STDLIB`][`<boost/config.hpp>`][
1369Defined as a string describing the name and version number of the standard
1370library in use. Mainly for debugging the configuration.
1371]]
1372[[`BOOST_PLATFORM`][`<boost/config.hpp>`][
1373Defined as a string describing the name of the platform. Mainly for debugging
1374the configuration.
1375]]
1376]
1377
1378[endsect]
1379
1380[#deprecated_macros]
1381
1382[section Boost Deprecated Macros]
1383
1384The following have been deprecated; please use the replacements instead.
1385They 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
1451The following macros and helper headers are of use to authors whose libraries
1452include 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
1458See [@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
1462Some compilers support C++ extensions that control which symbols
1463will be exported from shared libraries such as dynamic shared objects (DSO's) on Unix-like
1464systems or dynamic-link libraries (DLL's) on Windows.
1465
1466The Microsoft VC++ compiler has long supplied
1467`__declspec(dllexport)` and `__declspec(dllimport)` extensions for this purpose,
1468as do virtually all other compilers targeting the Windows platform.
1469
1470Modern versions of the GNU GCC compiler provide the `__attribute__((visibility("default")))`
1471extension 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
1474Boost supplies several macros to make it easier to manage symbol visibility in a way that
1475is portable between compilers and operating systems.
1476
1477[table
1478[[Macro ][Description ]]
1479[[`BOOST_SYMBOL_EXPORT`][
1480Defines the syntax of a C++ language extension that indicates a symbol is to be exported from a shared library.
1481If the compiler has no such extension, the macro is defined with no replacement text.
1482]]
1483[[`BOOST_SYMBOL_IMPORT`][
1484Defines the syntax of a C++ language extension that indicates a symbol is to be imported from a shared library.
1485If the compiler has no such extension, the macro is defined with no replacement text.
1486]]
1487[[`BOOST_SYMBOL_VISIBLE`][
1488Defines the syntax of a C++ language extension that indicates a symbol is to be globally visible.
1489If the compiler has no such extension, the macro is defined with no replacement text.
1490Needed for classes that are not otherwise exported, but are used by RTTI. Examples include
1491class for objects that will be thrown as exceptions or used in dynamic_casts,
1492across 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``
1496Without BOOST_SYMBOL_VISIBLE, it would be impossible to catch my_exception thrown from a shared library
1497compiled by GCC with the -fvisibility=hidden option.
1498]]
1499[[`BOOST_HAS_DECLSPEC`][
1500The compiler has C++ extensions `__declspec(dllexport)` and `__declspec(dllimport)` to control
1501export/import of symbols from shared libraries.
1502['Deprecated. This macro is no longer necessary since BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT
1503are now supplied. It is provided to support legacy code.]
1504]]
1505]
1506
1507Typical 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
1547When linking against a pre-compiled library it vital that the ABI used by the
1548compiler when building the library ['matches exactly] the ABI used by the code
1549using the library. In this case ABI means things like the struct packing
1550arrangement 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,
1552or runtime library variations, which have to be dealt with by build variants.
1553To put this in perspective there is one compiler (Borland's) that has so many
1554compiler options that make subtle changes to the ABI, that at least in theory
1555there 3200 combinations, and that's without considering runtime library
1556variations. Fortunately these variations can be managed by `#pragma`'s that
1557tell the compiler what ABI to use for the types declared in your library.
1558In order to avoid sprinkling `#pragma`'s all over the boost headers, there are
1559some 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
1588The user can disable this mechanism by defining `BOOST_DISABLE_ABI_HEADERS`, or
1589they can define `BOOST_ABI_PREFIX` and/or `BOOST_ABI_SUFFIX` to point to their
1590own prefix/suffix headers if they so wish.
1591
1592[endsect]
1593
1594[section Automatic library selection]
1595
1596It is essential that users link to a build of a library which was built against
1597the same runtime library that their application will be built against -if this
1598does not happen then the library will not be binary compatible with their own
1599code- and there is a high likelihood that their application will experience
1600runtime crashes. These kinds of problems can be extremely time consuming and
1601difficult to debug, and often lead to frustrated users and authors alike (simply
1602selecting the right library to link against is not as easy as it seems when
1603their are 6-8 of them to chose from, and some users seem to be blissfully
1604unaware that there even are different runtimes available to them).
1605
1606To solve this issue, some compilers allow source code to contain `#pragma`'s that
1607instruct the linker which library to link against, all the user need do is
1608include the headers they need, place the compiled libraries in their library
1609search path, and the compiler and linker do the rest. Boost.config supports
1610this via the header `<boost/config/auto_link.hpp>`, before including this header
1611one or more of the following macros need to be defined:
1612
1613[variablelist
1614[[`BOOST_LIB_NAME`][
1615Required: An identifier containing the basename of the library, for
1616example 'boost_regex'.
1617]]
1618[[`BOOST_DYN_LINK`][
1619Optional: when set link to dll rather than static library.
1620]]
1621[[`BOOST_LIB_DIAGNOSTIC`][
1622Optional: when set the header will print out the name of the library selected
1623(useful for debugging).
1624]]
1625]
1626
1627If the compiler supports this mechanism, then it will be told to link against
1628the appropriately named library, the actual algorithm used to mangle the name
1629of the library is documented inside `<boost/config/auto_link.hpp>` and has to
1630match 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