3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Boost Macro Reference</title>
5 <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../index.html" title="Boost.Config">
8 <link rel="up" href="../index.html" title="Boost.Config">
9 <link rel="prev" href="../index.html" title="Boost.Config">
10 <link rel="next" href="build_config.html" title="Build Time Configuration">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="build_config.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="boost_config.boost_macro_reference"></a><a class="link" href="boost_macro_reference.html" title="Boost Macro Reference">Boost Macro Reference</a>
28 </h2></div></div></div>
29 <div class="toc"><dl class="toc">
30 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__03_defects">Macros
31 that describe C++03 defects</a></span></dt>
32 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_optional_features">Macros
33 that describe optional features</a></span></dt>
34 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_possible_c___future_features">Macros
35 that describe possible C++ future features</a></span></dt>
36 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__11_features_not_supported">Macros
37 that describe C++11 features not supported</a></span></dt>
38 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_allow_use_of_c__11_features_with_c__03_compilers">Macros
39 that allow use of C++11 features with C++03 compilers</a></span></dt>
40 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__14_features_not_supported">Macros
41 that describe C++14 features not supported</a></span></dt>
42 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_allow_use_of_c__14_features_with_c__11_or_earlier_compilers">Macros
43 that allow use of C++14 features with C++11 or earlier compilers</a></span></dt>
44 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__17_features_not_supported">Macros
45 that describe C++17 features not supported</a></span></dt>
46 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.boost_helper_macros">Boost
47 Helper Macros</a></span></dt>
48 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.boost_informational_macros">Boost
49 Informational Macros</a></span></dt>
50 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.boost_deprecated_macros">Boost
51 Deprecated Macros</a></span></dt>
52 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code">Macros
53 for libraries with separate source code</a></span></dt>
56 <div class="titlepage"><div><div><h3 class="title">
57 <a name="boost_config.boost_macro_reference.macros_that_describe_c__03_defects"></a><a name="config_defects"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__03_defects" title="Macros that describe C++03 defects">Macros
58 that describe C++03 defects</a>
59 </h3></div></div></div>
61 The following macros all describe features that are required by the C++03
62 standard, if one of the following macros is defined, then it represents a
63 defect in the compiler's conformance with the 2003 standard.
65 <div class="informaltable"><table class="table">
92 <code class="computeroutput"><span class="identifier">BOOST_BCB_PARTIAL_SPECIALIZATION_BUG</span></code>
102 The compiler exhibits certain partial specialisation bug - probably
103 Borland C++ Builder specific.
110 <code class="computeroutput"><span class="identifier">BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL</span></code>
120 Argument dependent lookup fails if there is a using declaration
121 for the symbol being looked up in the current scope. For example,
122 using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_pointer</span></code>; prevents ADL from
123 finding overloads of <code class="computeroutput"><span class="identifier">get_pointer</span></code>
124 in namespaces nested inside boost (but not elsewhere). Probably
132 <code class="computeroutput"><span class="identifier">BOOST_NO_ADL_BARRIER</span></code>
142 The compiler locates and searches namespaces that it should <span class="emphasis"><em>*not*</em></span>
143 in fact search when performing argument dependent lookup.
150 <code class="computeroutput"><span class="identifier">BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP</span></code>
160 Compiler does not implement argument-dependent lookup (also named
161 Koenig lookup); see std::3.4.2 [basic.koenig.lookup]
168 <code class="computeroutput"><span class="identifier">BOOST_NO_AUTO_PTR</span></code>
178 If the compiler / library supplies non-standard or broken <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">auto_ptr</span></code>.
185 <code class="computeroutput"><span class="identifier">BOOST_NO_COMPLETE_VALUE_INITIALIZATION</span></code>
195 Compiler has not completely implemented value-initialization. See
196 also <a href="../../../../utility/value_init.htm#compiler_issues" target="_top">The
197 Utility/Value Init docs</a>
204 <code class="computeroutput"><span class="identifier">BOOST_NO_CTYPE_FUNCTIONS</span></code>
214 The Platform does not provide functions for the character-classifying
215 operations <code class="computeroutput"><span class="special"><</span><span class="identifier">ctype</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code> and <code class="computeroutput"><span class="special"><</span><span class="identifier">cctype</span><span class="special">></span></code>,
223 <code class="computeroutput"><span class="identifier">BOOST_NO_CV_SPECIALIZATIONS</span></code>
233 If template specialisations for cv-qualified types conflict with
234 a specialisation for a cv-unqualififed type.
241 <code class="computeroutput"><span class="identifier">BOOST_NO_CV_VOID_SPECIALIZATIONS</span></code>
251 If template specialisations for cv-void types conflict with a specialisation
259 <code class="computeroutput"><span class="identifier">BOOST_NO_CWCHAR</span></code>
269 The Platform does not provide <code class="computeroutput"><span class="special"><</span><span class="identifier">wchar</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
270 and <code class="computeroutput"><span class="special"><</span><span class="identifier">cwchar</span><span class="special">></span></code>.
277 <code class="computeroutput"><span class="identifier">BOOST_NO_CWCTYPE</span></code>
287 The Platform does not provide <code class="computeroutput"><span class="special"><</span><span class="identifier">wctype</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
288 and <code class="computeroutput"><span class="special"><</span><span class="identifier">cwctype</span><span class="special">></span></code>.
295 <code class="computeroutput"><span class="identifier">BOOST_NO_FENV_H</span></code>
300 Platform, Standard library
305 The C standard library doesn't provide <code class="computeroutput"><span class="special"><</span><span class="identifier">fenv</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>.
306 <a href="../../../../../boost/detail/fenv.hpp" target="_top"><code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">fenv</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a>
307 should be included instead of <code class="computeroutput"><span class="special"><</span><span class="identifier">fenv</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
308 for maximum portability on platforms which do provide <code class="computeroutput"><span class="special"><</span><span class="identifier">fenv</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>.
315 <code class="computeroutput"><span class="identifier">BOOST_NO_DEPENDENT_NESTED_DERIVATIONS</span></code>
325 The compiler fails to compile a nested class that has a dependent
328 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
329 <span class="keyword">struct</span> <span class="identifier">foo</span> <span class="special">:</span> <span class="special">{</span>
330 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">U</span><span class="special">></span>
331 <span class="keyword">struct</span> <span class="identifier">bar</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">U</span> <span class="special">{};</span>
341 <code class="computeroutput"><span class="identifier">BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS</span></code>
351 Template value parameters cannot have a dependent type, for example:
353 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">type</span> <span class="identifier">value</span><span class="special">></span>
354 <span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>
363 <code class="computeroutput"><span class="identifier">BOOST_NO_EXCEPTION_STD_NAMESPACE</span></code>
373 The standard library does not put some or all of the contents of
374 <code class="computeroutput"><span class="special"><</span><span class="identifier">exception</span><span class="special">></span></code> in namespace std.
381 <code class="computeroutput"><span class="identifier">BOOST_NO_EXCEPTIONS</span></code>
391 The compiler does not support exception handling (this setting
392 is typically required by many C++ compilers for embedded platforms).
393 Note that there is no requirement for boost libraries to honor
394 this configuration setting - indeed doing so may be impossible
395 in some cases. Those libraries that do honor this will typically
396 abort if a critical error occurs - you have been warned!
403 <code class="computeroutput"><span class="identifier">BOOST_NO_FUNCTION_TEMPLATE_ORDERING</span></code>
413 The compiler does not perform function template ordering or its
414 function template ordering is incorrect.
416 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// #1</span>
417 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span><span class="special">);</span>
419 <span class="comment">// #2</span>
420 <span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">U</span><span class="special">></span> <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span><span class="special">(*)(</span><span class="identifier">U</span><span class="special">));</span>
422 <span class="keyword">void</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span>
424 <span class="identifier">f</span><span class="special">(&</span><span class="identifier">bar</span><span class="special">);</span> <span class="comment">// should choose #2.</span>
433 <code class="computeroutput"><span class="identifier">BOOST_NO_INCLASS_MEMBER_INITIALIZATION</span></code>
443 Compiler violates std::9.4.2/4.
450 <code class="computeroutput"><span class="identifier">BOOST_NO_INTRINSIC_WCHAR_T</span></code>
460 The C++ implementation does not provide <code class="computeroutput"><span class="keyword">wchar_t</span></code>,
461 or it is really a synonym for another integral type. Use this symbol
462 to decide whether it is appropriate to explicitly specialize a
463 template on <code class="computeroutput"><span class="keyword">wchar_t</span></code>
464 if there is already a specialization for other integer types.
471 <code class="computeroutput"><span class="identifier">BOOST_NO_IOSFWD</span></code>
481 The standard library lacks <code class="computeroutput"><span class="special"><</span><span class="identifier">iosfwd</span><span class="special">></span></code>.
488 <code class="computeroutput"><span class="identifier">BOOST_NO_IOSTREAM</span></code>
498 The standard library lacks <code class="computeroutput"><span class="special"><</span><span class="identifier">iostream</span><span class="special">></span></code>,
499 <code class="computeroutput"><span class="special"><</span><span class="identifier">istream</span><span class="special">></span></code> or <code class="computeroutput"><span class="special"><</span><span class="identifier">ostream</span><span class="special">></span></code>.
506 <code class="computeroutput"><span class="identifier">BOOST_NO_IS_ABSTRACT</span></code>
516 The C++ compiler does not support SFINAE with abstract types, this
517 is covered by <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#337" target="_top">Core
518 Language DR337</a>, but is not part of the current standard.
519 Fortunately most compilers that support SFINAE also support this
520 DR. See also BOOST_NO_SFINAE and BOOST_NO_SFINAE_EXPR
527 <code class="computeroutput"><span class="identifier">BOOST_NO_LIMITS</span></code>
537 The C++ implementation does not provide the <code class="computeroutput"><span class="special"><</span><span class="identifier">limits</span><span class="special">></span></code>
538 header. Never check for this symbol in library code; always include
539 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">limits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>, which guarantees to provide
540 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span></code>.
547 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NUMERIC_LIMITS</span></code>
557 C++11 additions to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span></code>
558 are not available for use. <code class="computeroutput"><span class="keyword">static</span>
559 <span class="identifier">function</span> <span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">lowest</span><span class="special">()</span></code> the lowest finite value representable
560 by the numeric type. <code class="computeroutput"><span class="keyword">static</span>
561 <span class="keyword">int</span> <span class="keyword">const</span>
562 <span class="identifier">max_digits10</span></code> the number
563 of decimal digits that are required to make sure that two distinct
564 values of the type have distinct decimal representations. <code class="computeroutput"><span class="keyword">template</span><span class="special"><></span>
565 <span class="keyword">class</span> <span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">char16_t</span><span class="special">>;</span></code>, see also <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CHAR16_T</span></code>,
566 <code class="computeroutput"><span class="keyword">template</span><span class="special"><></span>
567 <span class="keyword">class</span> <span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">char32_t</span><span class="special">>;</span></code> see also <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CHAR32_T</span></code>.
568 Replaces BOOST_NO_NUMERIC_LIMITS_LOWEST.
575 <code class="computeroutput"><span class="identifier">BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS</span></code>
585 Constants such as <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_signed</span></code>
586 are not available for use at compile-time.
593 <code class="computeroutput"><span class="identifier">BOOST_NO_LONG_LONG_NUMERIC_LIMITS</span></code>
603 There is no specialization for <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">long</span>
604 <span class="keyword">long</span><span class="special">></span></code>
605 and <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">unsigned</span>
606 <span class="keyword">long</span> <span class="keyword">long</span><span class="special">></span></code>. <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">limits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
607 will then add these specializations as a standard library "fix"
608 only if the compiler supports the <code class="computeroutput"><span class="keyword">long</span>
609 <span class="keyword">long</span></code> datatype.
616 <code class="computeroutput"><span class="identifier">BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS</span></code>
626 The compiler does not support the specialization of individual
627 member functions of template classes.
634 <code class="computeroutput"><span class="identifier">BOOST_NO_MEMBER_TEMPLATE_KEYWORD</span></code>
644 If the compiler supports member templates, but not the template
645 keyword when accessing member template classes.
652 <code class="computeroutput"><span class="identifier">BOOST_NO_MEMBER_TEMPLATE_FRIENDS</span></code>
662 Member template friend syntax (<code class="computeroutput"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span>
663 <span class="identifier">P</span><span class="special">></span>
664 <span class="keyword">friend</span> <span class="keyword">class</span>
665 <span class="identifier">frd</span><span class="special">;</span></code>)
666 described in the C++ Standard, 14.5.3, not supported.
673 <code class="computeroutput"><span class="identifier">BOOST_NO_MEMBER_TEMPLATES</span></code>
683 Member template functions not fully supported.
690 <code class="computeroutput"><span class="identifier">BOOST_NO_MS_INT64_NUMERIC_LIMITS</span></code>
700 There is no specialization for <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">__int64</span><span class="special">></span></code> and <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">unsigned</span>
701 <span class="identifier">__int64</span><span class="special">></span></code>.
702 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">limits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> will then add these specializations
703 as a standard library "fix", only if the compiler supports
704 the <code class="computeroutput"><span class="identifier">__int64</span></code> datatype.
711 <code class="computeroutput"><span class="identifier">BOOST_NO_NESTED_FRIENDSHIP</span></code>
721 Compiler doesn't allow a nested class to access private members
722 of its containing class. Probably Borland/CodeGear specific.
729 <code class="computeroutput"><span class="identifier">BOOST_NO_OPERATORS_IN_NAMESPACE</span></code>
739 Compiler requires inherited operator friend functions to be defined
740 at namespace scope, then using'ed to boost. Probably GCC specific.
741 See <a href="../../../../../boost/operators.hpp" target="_top"><code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">operators</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a> for example.
748 <code class="computeroutput"><span class="identifier">BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS</span></code>
758 The compiler does not correctly handle partial specializations
759 which depend upon default arguments in the primary template.
766 <code class="computeroutput"><span class="identifier">BOOST_NO_POINTER_TO_MEMBER_CONST</span></code>
776 The compiler does not correctly handle pointers to const member
777 functions, preventing use of these in overloaded function templates.
778 See <a href="../../../../../boost/functional.hpp" target="_top"><code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">functional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a> for example.
785 <code class="computeroutput"><span class="identifier">BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS</span></code>
795 Pointers to members don't work when used as template parameters.
802 <code class="computeroutput"><span class="identifier">BOOST_NO_PRIVATE_IN_AGGREGATE</span></code>
812 The compiler misreads 8.5.1, treating classes as non-aggregate
813 if they contain private or protected member functions.
820 <code class="computeroutput"><span class="identifier">BOOST_NO_RESTRICT_REFERENCES</span></code>
830 Compiler-specific <code class="computeroutput"><span class="identifier">restrict</span></code>
831 keyword can not be applied to references.
838 <code class="computeroutput"><span class="identifier">BOOST_NO_RTTI</span></code>
848 The compiler may (or may not) have the typeid operator, but RTTI
849 on the dynamic type of an object is not supported.
856 <code class="computeroutput"><span class="identifier">BOOST_NO_SFINAE</span></code>
866 The compiler does not support the "Substitution Failure Is
867 Not An Error" meta-programming idiom. This is the lightweight
868 pre-C++11 version of SFINAE.
875 <code class="computeroutput"><span class="identifier">BOOST_NO_SFINAE_EXPR</span></code>
885 The compiler does not support usage of SFINAE with arbitrary expressions.
886 This is the post-C++11 SFINAE, but excludes a few specific corner
887 cases, see also BOOST_NO_CXX11_SFINAE_EXPR.
894 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_ALLOCATOR</span></code>
904 The C++ standard library does not provide a standards conforming
905 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span></code>.
912 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_DISTANCE</span></code>
922 The platform does not have a conforming version of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span></code>.
929 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_ITERATOR</span></code>
939 The C++ implementation fails to provide the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator</span></code>
947 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_ITERATOR_TRAITS</span></code>
957 The compiler does not provide a standard compliant implementation
958 of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span></code>. Note that the
959 compiler may still have a non-standard implementation.
966 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_LOCALE</span></code>
976 The standard library lacks <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span></code>.
983 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_MESSAGES</span></code>
993 The standard library lacks a conforming <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">messages</span></code>
1001 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_MIN_MAX</span></code>
1011 The C++ standard library does not provide the <code class="computeroutput"><span class="identifier">min</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">max</span><span class="special">()</span></code> template functions that should
1012 be in <code class="computeroutput"><span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span></code>.
1019 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN</span></code>
1029 Defined if the standard library's output iterators are not assignable.
1036 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_TYPEINFO</span></code>
1046 The <typeinfo> header declares <code class="computeroutput"><span class="identifier">type_info</span></code>
1047 in the global namespace instead of namespace std.
1054 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_USE_FACET</span></code>
1064 The standard library lacks a conforming <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">use_facet</span></code>.
1071 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_WSTREAMBUF</span></code>
1081 The standard library's implementation of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_streambuf</span><span class="special"><</span><span class="keyword">wchar_t</span><span class="special">></span></code> is either missing, incomplete,
1089 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_WSTRING</span></code>
1099 The standard library lacks <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">wstring</span></code>.
1106 <code class="computeroutput"><span class="identifier">BOOST_NO_STDC_NAMESPACE</span></code>
1116 The contents of C++ standard headers for C library functions (the
1117 <code class="computeroutput"><span class="special"><</span><span class="identifier">c</span><span class="special">...></span></code> headers) have not been placed
1118 in namespace std. This test is difficult - some libraries "fake"
1119 the std C functions by adding using declarations to import them
1120 into namespace std, unfortunately they don't necessarily catch
1128 <code class="computeroutput"><span class="identifier">BOOST_NO_STRINGSTREAM</span></code>
1138 The C++ implementation does not provide the <code class="computeroutput"><span class="special"><</span><span class="identifier">sstream</span><span class="special">></span></code>
1146 <code class="computeroutput"><span class="identifier">BOOST_NO_SWPRINTF</span></code>
1156 The platform does not have a conforming version of <code class="computeroutput"><span class="identifier">swprintf</span></code>.
1163 <code class="computeroutput"><span class="identifier">BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION</span></code>
1173 Class template partial specialization (14.5.4 [temp.class.spec])
1181 <code class="computeroutput"><span class="identifier">BOOST_NO_TEMPLATED_IOSTREAMS</span></code>
1191 The standard library does not provide templated iostream classes.
1198 <code class="computeroutput"><span class="identifier">BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS</span></code>
1208 The standard library does not provide templated iterator constructors
1216 <code class="computeroutput"><span class="identifier">BOOST_NO_TEMPLATE_TEMPLATES</span></code>
1226 The compiler does not support template template parameters.
1233 <code class="computeroutput"><span class="identifier">BOOST_NO_TYPEID</span></code>
1243 The compiler does not support the typeid operator at all.
1250 <code class="computeroutput"><span class="identifier">BOOST_NO_TYPENAME_WITH_CTOR</span></code>
1260 The typename keyword cannot be used when creating a temporary of
1268 <code class="computeroutput"><span class="identifier">BOOST_NO_UNREACHABLE_RETURN_DETECTION</span></code>
1278 If a return is unreachable, then no return statement should be
1279 required, however some compilers insist on it, while other issue
1280 a bunch of warnings if it is in fact present.
1287 <code class="computeroutput"><span class="identifier">BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE</span></code>
1297 The compiler will not accept a using declaration that brings a
1298 function from a typename used as a base class into a derived class
1299 if functions of the same name are present in the derived class.
1306 <code class="computeroutput"><span class="identifier">BOOST_NO_USING_TEMPLATE</span></code>
1316 The compiler will not accept a using declaration that imports a
1317 template class or function from another namespace. Originally a
1318 Borland specific problem with imports to/from the global namespace,
1319 extended to MSVC6 which has a specific issue with importing template
1320 classes (but not functions).
1327 <code class="computeroutput"><span class="identifier">BOOST_NO_VOID_RETURNS</span></code>
1337 The compiler does not allow a void function to return the result
1338 of calling another void function.
1340 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span> <span class="special">{}</span>
1341 <span class="keyword">void</span> <span class="identifier">g</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">f</span><span class="special">();</span> <span class="special">}</span>
1350 <div class="section">
1351 <div class="titlepage"><div><div><h3 class="title">
1352 <a name="boost_config.boost_macro_reference.macros_that_describe_optional_features"></a><a name="config_features"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_optional_features" title="Macros that describe optional features">Macros
1353 that describe optional features</a>
1354 </h3></div></div></div>
1356 The following macros describe features that are not required by the C++ standard.
1357 The macro is only defined if the feature is present.
1359 <div class="informaltable"><table class="table">
1386 <code class="computeroutput"><span class="identifier">BOOST_HAS_BETHREADS</span></code>
1396 The platform supports BeOS style threads.
1403 <code class="computeroutput"><span class="identifier">BOOST_HAS_CLOCK_GETTIME</span></code>
1413 The platform has the POSIX API <code class="computeroutput"><span class="identifier">clock_gettime</span></code>.
1420 <code class="computeroutput"><span class="identifier">BOOST_HAS_DIRENT_H</span></code>
1430 The platform has the POSIX header <code class="computeroutput"><span class="special"><</span><span class="identifier">dirent</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>.
1437 <code class="computeroutput"><span class="identifier">BOOST_HAS_EXPM1</span></code>
1447 The platform has the functions <code class="computeroutput"><span class="identifier">expm1</span></code>,
1448 <code class="computeroutput"><span class="identifier">expm1f</span></code> and <code class="computeroutput"><span class="identifier">expm1l</span></code> in <code class="computeroutput"><span class="special"><</span><span class="identifier">math</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
1455 <code class="computeroutput"><span class="identifier">BOOST_HAS_FLOAT128</span></code>
1465 The compiler has <code class="computeroutput"><span class="identifier">__float128</span></code>
1466 as a native type which is distinct from all the regular C++ floating
1474 <code class="computeroutput"><span class="identifier">BOOST_HAS_FTIME</span></code>
1484 The platform has the Win32 API type FTIME.
1491 <code class="computeroutput"><span class="identifier">BOOST_HAS_GETSYSTEMTIMEASFILETIME</span></code>
1501 The platform has the Win32 API GetSystemTimeAsFileTime.
1508 <code class="computeroutput"><span class="identifier">BOOST_HAS_GETTIMEOFDAY</span></code>
1518 The platform has the POSIX API <code class="computeroutput"><span class="identifier">gettimeofday</span></code>.
1525 <code class="computeroutput"><span class="identifier">BOOST_HAS_HASH</span></code>
1535 The C++ implementation provides the (SGI) hash_set and hash_map
1536 classes. When defined, <code class="computeroutput"><span class="identifier">BOOST_HASH_SET_HEADER</span></code>
1537 and <code class="computeroutput"><span class="identifier">BOOST_HASH_LIST_HEADER</span></code>
1538 will contain the names of the header needed to access hash_set
1539 and hash_map; <code class="computeroutput"><span class="identifier">BOOST_STD_EXTENSION_NAMESPACE</span></code>
1540 will provide the namespace in which the two class templates reside.
1547 <code class="computeroutput"><span class="identifier">BOOST_HAS_INT128</span></code>
1557 The compiler has <code class="computeroutput"><span class="identifier">__int128</span></code>
1558 and <code class="computeroutput"><span class="keyword">unsigned</span> <span class="identifier">__int128</span></code>
1559 as native types which are distinct from all the regular C++ integer
1567 <code class="computeroutput"><span class="identifier">BOOST_HAS_LOG1P</span></code>
1577 The platform has the functions <code class="computeroutput"><span class="identifier">log1p</span></code>,
1578 <code class="computeroutput"><span class="identifier">log1pf</span></code> and <code class="computeroutput"><span class="identifier">log1pl</span></code> in <code class="computeroutput"><span class="special"><</span><span class="identifier">math</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>.
1585 <code class="computeroutput"><span class="identifier">BOOST_HAS_MACRO_USE_FACET</span></code>
1595 The standard library lacks a conforming <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">use_facet</span></code>,
1596 but has a macro <code class="computeroutput"><span class="identifier">_USE</span><span class="special">(</span><span class="identifier">loc</span><span class="special">,</span> <span class="identifier">Type</span><span class="special">)</span></code> that does the job. This is primarily
1597 for the Dinkumware std lib.
1604 <code class="computeroutput"><span class="identifier">BOOST_HAS_MS_INT64</span></code>
1614 The compiler supports the <code class="computeroutput"><span class="identifier">__int64</span></code>
1622 <code class="computeroutput"><span class="identifier">BOOST_HAS_NANOSLEEP</span></code>
1632 The platform has the POSIX API nanosleep.
1639 <code class="computeroutput"><span class="identifier">BOOST_HAS_NL_TYPES_H</span></code>
1649 The platform has an <code class="computeroutput"><span class="special"><</span><span class="identifier">nl_types</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>.
1656 <code class="computeroutput"><span class="identifier">BOOST_HAS_NRVO</span></code>
1666 Indicated that the compiler supports the named return value optimization
1667 (NRVO). Used to select the most efficient implementation for some
1668 function. See <a href="../../../../../boost/operators.hpp" target="_top"><code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">operators</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code></a> for example.
1675 <code class="computeroutput"><span class="identifier">BOOST_HAS_PARTIAL_STD_ALLOCATOR</span></code>
1685 The standard library has a partially conforming <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span></code>
1686 class, but without any of the member templates.
1693 <code class="computeroutput"><span class="identifier">BOOST_HAS_PRAGMA_ONCE</span></code>
1703 The compiler recognizes the <code class="computeroutput"><span class="preprocessor">#pragma</span>
1704 <span class="identifier">once</span></code> directive which
1705 tells that the containing header should be included only once while
1706 preprocessing the current translation unit. The pragma may improve
1707 compile times of large projects with some compilers.
1714 <code class="computeroutput"><span class="identifier">BOOST_HAS_PRAGMA_DETECT_MISMATCH</span></code>
1724 The compiler recognizes the <code class="computeroutput"><span class="preprocessor">#pragma</span>
1725 <span class="identifier">detect_mismatch</span><span class="special">(</span><span class="string">"name"</span><span class="special">,</span>
1726 <span class="string">"value"</span><span class="special">)</span></code>
1727 directive which tells that the link stage should be terminated
1728 with error if values for provided <code class="computeroutput"><span class="string">"name"</span></code>
1729 missmatch. This pragma may be a help in preventing ODR violations
1730 and ensuring that different modules are compiled with same flags.
1737 <code class="computeroutput"><span class="identifier">BOOST_HAS_PTHREAD_DELAY_NP</span></code>
1747 The platform has the POSIX API <code class="computeroutput"><span class="identifier">pthread_delay_np</span></code>.
1754 <code class="computeroutput"><span class="identifier">BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE</span></code>
1764 The platform has the POSIX API <code class="computeroutput"><span class="identifier">pthread_mutexattr_settype</span></code>.
1771 <code class="computeroutput"><span class="identifier">BOOST_HAS_PTHREAD_YIELD</span></code>
1781 The platform has the POSIX API <code class="computeroutput"><span class="identifier">pthread_yield</span></code>.
1788 <code class="computeroutput"><span class="identifier">BOOST_HAS_PTHREADS</span></code>
1798 The platform support POSIX style threads.
1805 <code class="computeroutput"><span class="identifier">BOOST_HAS_SCHED_YIELD</span></code>
1815 The platform has the POSIX API <code class="computeroutput"><span class="identifier">sched_yield</span></code>.
1822 <code class="computeroutput"><span class="identifier">BOOST_HAS_SGI_TYPE_TRAITS</span></code>
1827 Compiler, Standard library
1832 The compiler has native support for SGI style type traits.
1839 <code class="computeroutput"><span class="identifier">BOOST_HAS_STDINT_H</span></code>
1849 The platform has a <code class="computeroutput"><span class="special"><</span><span class="identifier">stdint</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
1856 <code class="computeroutput"><span class="identifier">BOOST_HAS_SLIST</span></code>
1866 The C++ implementation provides the (SGI) slist class. When defined,
1867 <code class="computeroutput"><span class="identifier">BOOST_SLIST_HEADER</span></code>
1868 will contain the name of the header needed to access <code class="computeroutput"><span class="identifier">slist</span></code> and <code class="computeroutput"><span class="identifier">BOOST_STD_EXTENSION_NAMESPACE</span></code>
1869 will provide the namespace in which <code class="computeroutput"><span class="identifier">slist</span></code>
1877 <code class="computeroutput"><span class="identifier">BOOST_HAS_STLP_USE_FACET</span></code>
1887 The standard library lacks a conforming <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">use_facet</span></code>,
1888 but has a workaround class-version that does the job. This is primarily
1889 for the STLport std lib.
1896 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_ARRAY</span></code>
1906 The library has a TR1 conforming version of <code class="computeroutput"><span class="special"><</span><span class="identifier">array</span><span class="special">></span></code>.
1907 This macro is only guaranteed to be defined after including one
1908 of the headers from Boost.TR1. Further this macro is now deprecated
1909 in favour of BOOST_NO_CXX11_HDR_ARRAY.
1916 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_COMPLEX_OVERLOADS</span></code>
1926 The library has a version of <code class="computeroutput"><span class="special"><</span><span class="identifier">complex</span><span class="special">></span></code>
1927 that supports passing scalars to the complex number algorithms.
1934 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG</span></code>
1944 The library has a version of <code class="computeroutput"><span class="special"><</span><span class="identifier">complex</span><span class="special">></span></code>
1945 that includes the new inverse trig functions from TR1.
1952 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_REFERENCE_WRAPPER</span></code>
1962 The library has TR1 conforming reference wrappers in <code class="computeroutput"><span class="special"><</span><span class="identifier">functional</span><span class="special">></span></code>. This macro is only guaranteed
1963 to be defined after including one of the headers from Boost.TR1.
1964 Further this macro is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL.
1971 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_RESULT_OF</span></code>
1981 The library has a TR1 conforming result_of template in <code class="computeroutput"><span class="special"><</span><span class="identifier">functional</span><span class="special">></span></code>. This macro is only guaranteed
1982 to be defined after including one of the headers from Boost.TR1.
1983 Further this macro is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL.
1990 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_MEM_FN</span></code>
2000 The library has a TR1 conforming mem_fn function template in <code class="computeroutput"><span class="special"><</span><span class="identifier">functional</span><span class="special">></span></code>. This macro is only guaranteed
2001 to be defined after including one of the headers from Boost.TR1.
2002 Further this macro is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL.
2009 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_BIND</span></code>
2019 The library has a TR1 conforming bind function template in <code class="computeroutput"><span class="special"><</span><span class="identifier">functional</span><span class="special">></span></code>. This macro is only guaranteed
2020 to be defined after including one of the headers from Boost.TR1.
2021 Further this macro is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL.
2028 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_FUNCTION</span></code>
2038 The library has a TR1 conforming function class template in <code class="computeroutput"><span class="special"><</span><span class="identifier">functional</span><span class="special">></span></code>. This macro is only guaranteed
2039 to be defined after including one of the headers from Boost.TR1.
2040 Further this macro is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL.
2047 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_HASH</span></code>
2057 The library has a TR1 conforming hash function template in <code class="computeroutput"><span class="special"><</span><span class="identifier">functional</span><span class="special">></span></code>. This macro is only guaranteed
2058 to be defined after including one of the headers from Boost.TR1.
2059 Further this macro is now deprecated in favour of BOOST_NO_CXX11_HDR_FUNCTIONAL.
2066 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_SHARED_PTR</span></code>
2076 The library has a TR1 conforming <code class="computeroutput"><span class="identifier">shared_ptr</span></code>
2077 class template in <code class="computeroutput"><span class="special"><</span><span class="identifier">memory</span><span class="special">></span></code>.
2078 This macro is only guaranteed to be defined after including one
2079 of the headers from Boost.TR1. Further this macro is now deprecated
2080 in favour of BOOST_NO_CXX11_SMART_PTR.
2087 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_RANDOM</span></code>
2097 The library has a TR1 conforming version of <code class="computeroutput"><span class="special"><</span><span class="identifier">random</span><span class="special">></span></code>.
2098 This macro is only guaranteed to be defined after including one
2099 of the headers from Boost.TR1. Further this macro is now deprecated
2100 in favour of BOOST_NO_CXX11_HDR_RANDOM.
2107 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_REGEX</span></code>
2117 The library has a TR1 conforming version of <code class="computeroutput"><span class="special"><</span><span class="identifier">regex</span><span class="special">></span></code>.
2118 This macro is only guaranteed to be defined after including one
2119 of the headers from Boost.TR1. Further this macro is now deprecated
2120 in favour of BOOST_NO_CXX11_HDR_REGEX.
2127 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_TUPLE</span></code>
2137 The library has a TR1 conforming version of <code class="computeroutput"><span class="special"><</span><span class="identifier">tuple</span><span class="special">></span></code>.
2138 This macro is only guaranteed to be defined after including one
2139 of the headers from Boost.TR1. Further this macro is now deprecated
2140 in favour of BOOST_NO_CXX11_HDR_TUPLE.
2147 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_TYPE_TRAITS</span></code>
2157 The library has a TR1 conforming version of <code class="computeroutput"><span class="special"><</span><span class="identifier">type_traits</span><span class="special">></span></code>.
2158 This macro is only guaranteed to be defined after including one
2159 of the headers from Boost.TR1. Further this macro is now deprecated
2160 in favour of BOOST_NO_CXX11_HDR_TYPE_TRAITS.
2167 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_UTILITY</span></code>
2177 The library has the TR1 additions to <code class="computeroutput"><span class="special"><</span><span class="identifier">utility</span><span class="special">></span></code>
2178 (tuple interface to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span></code>).
2179 This macro is only guaranteed to be defined after including one
2180 of the headers from Boost.TR1. Further this macro is now deprecated
2181 in favour of BOOST_NO_CXX11_HDR_TUPLE.
2188 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_UNORDERED_MAP</span></code>
2198 The library has a TR1 conforming version of <code class="computeroutput"><span class="special"><</span><span class="identifier">unordered_map</span><span class="special">></span></code>.
2199 This macro is only guaranteed to be defined after including one
2200 of the headers from Boost.TR1. Further this macro is now deprecated
2201 in favour of BOOST_NO_CXX11_HDR_UNORDERED_MAP.
2208 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_UNORDERED_SET</span></code>
2218 The library has a TR1 conforming version of <code class="computeroutput"><span class="special"><</span><span class="identifier">unordered_set</span><span class="special">></span></code>.
2219 This macro is only guaranteed to be defined after including one
2220 of the headers from Boost.TR1. Further this macro is now deprecated
2221 in favour of BOOST_NO_CXX11_HDR_UNORDERED_SET.
2228 <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1</span></code>
2238 Implies all the other <code class="computeroutput"><span class="identifier">BOOST_HAS_TR1_</span><span class="special">*</span></code> macros should be set.
2245 <code class="computeroutput"><span class="identifier">BOOST_HAS_THREADS</span></code>
2255 Defined if the compiler, in its current translation mode, supports
2256 multiple threads of execution.
2263 <code class="computeroutput"><span class="identifier">BOOST_HAS_TWO_ARG_USE_FACET</span></code>
2273 The standard library lacks a conforming std::use_facet, but has
2274 a two argument version that does the job. This is primarily for
2275 the Rogue Wave std lib.
2282 <code class="computeroutput"><span class="identifier">BOOST_HAS_UNISTD_H</span></code>
2292 The Platform provides <code class="computeroutput"><span class="special"><</span><span class="identifier">unistd</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>.
2299 <code class="computeroutput"><span class="identifier">BOOST_HAS_WINTHREADS</span></code>
2309 The platform supports MS Windows style threads.
2316 <code class="computeroutput"><span class="identifier">BOOST_MSVC_STD_ITERATOR</span></code>
2326 Microsoft's broken version of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator</span></code>
2327 is being used. This implies that <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator</span></code>
2328 takes no more than two template parameters.
2335 <code class="computeroutput"><span class="identifier">BOOST_MSVC6_MEMBER_TEMPLATES</span></code>
2345 Microsoft Visual C++ 6.0 has enough member template idiosyncrasies
2346 (being polite) that <code class="computeroutput"><span class="identifier">BOOST_NO_MEMBER_TEMPLATES</span></code>
2347 is defined for this compiler. <code class="computeroutput"><span class="identifier">BOOST_MSVC6_MEMBER_TEMPLATES</span></code>
2348 is defined to allow compiler specific workarounds. This macro gets
2349 defined automatically if <code class="computeroutput"><span class="identifier">BOOST_NO_MEMBER_TEMPLATES</span></code>
2350 is not defined - in other words this is treated as a strict subset
2351 of the features required by the standard.
2358 <code class="computeroutput"><span class="identifier">BOOST_HAS_STDINT_H</span></code>
2368 There are no 1998 C++ Standard headers <code class="computeroutput"><span class="special"><</span><span class="identifier">stdint</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
2369 or <code class="computeroutput"><span class="special"><</span><span class="identifier">cstdint</span><span class="special">></span></code>, although the 1999 C Standard
2370 does include <code class="computeroutput"><span class="special"><</span><span class="identifier">stdint</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>.
2371 If <code class="computeroutput"><span class="special"><</span><span class="identifier">stdint</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code> is present, <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stdint</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
2372 can make good use of it, so a flag is supplied (signalling presence;
2373 thus the default is not present, conforming to the current C++
2381 <div class="section">
2382 <div class="titlepage"><div><div><h3 class="title">
2383 <a name="boost_config.boost_macro_reference.macros_that_describe_possible_c___future_features"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_possible_c___future_features" title="Macros that describe possible C++ future features">Macros
2384 that describe possible C++ future features</a>
2385 </h3></div></div></div>
2387 The following macros describe features that may be included in some future
2388 ISO C++ standard, but have not yet been approved for inclusion in the language.
2390 <div class="informaltable"><table class="table">
2410 <code class="computeroutput"><span class="identifier">BOOST_HAS_CONCEPTS</span></code>
2415 The compiler supports concepts.
2421 <div class="section">
2422 <div class="titlepage"><div><div><h3 class="title">
2423 <a name="boost_config.boost_macro_reference.macros_that_describe_c__11_features_not_supported"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__11_features_not_supported" title="Macros that describe C++11 features not supported">Macros
2424 that describe C++11 features not supported</a>
2425 </h3></div></div></div>
2427 The following macros describe features in the 2011 ISO C++ standard, formerly
2428 known as C++0x, that are not yet supported by a particular compiler or library.
2430 <div class="informaltable"><table class="table">
2451 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_ADDRESSOF</span></code>
2456 The standard library header <memory> has no working std::addressof.
2463 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_ALIGNAS</span></code>
2468 The compiler does not support the <code class="computeroutput"><span class="keyword">alignas</span></code>
2476 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_ALLOCATOR</span></code>
2481 The standard library does not provide a C++11 version of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span></code> in <memory>.
2488 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_ATOMIC_SMART_PTR</span></code>
2493 The standard library <memory> does not support atomic smart
2501 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_AUTO_DECLARATIONS</span></code>
2506 The compiler does not support type deduction for variables declared
2507 with the <code class="computeroutput"><span class="keyword">auto</span></code> keyword
2508 (<code class="computeroutput"><span class="keyword">auto</span> <span class="identifier">var</span>
2509 <span class="special">=</span> <span class="special">...;</span></code>).
2516 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS</span></code>
2521 The compiler does not support type deduction for multiple variables
2522 declared with the <code class="computeroutput"><span class="keyword">auto</span></code>
2523 keyword (<code class="computeroutput"><span class="keyword">auto</span> <span class="identifier">var</span>
2524 <span class="special">=</span> <span class="special">...,</span>
2525 <span class="special">*</span><span class="identifier">ptr</span>
2526 <span class="special">=</span> <span class="special">...;</span></code>).
2533 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CHAR16_T</span></code>
2538 The compiler does not support type <code class="computeroutput"><span class="keyword">char16_t</span></code>.
2545 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CHAR32_T</span></code>
2550 The compiler does not support type <code class="computeroutput"><span class="keyword">char32_t</span></code>.
2557 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CONSTEXPR</span></code>
2562 The compiler does not support <code class="computeroutput"><span class="keyword">constexpr</span></code>.
2569 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DECLTYPE</span></code>
2574 The compiler does not support <code class="computeroutput"><span class="keyword">decltype</span></code>.
2581 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DECLTYPE_N3276</span></code>
2586 The compiler does not support the extension to <code class="computeroutput"><span class="keyword">decltype</span></code>
2587 described in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf" target="_top">N3276</a>,
2588 accepted in Madrid, March 2011.
2595 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DELETED_FUNCTIONS</span></code>
2600 The compiler does not support deleted (<code class="computeroutput"><span class="special">=</span>
2601 <span class="keyword">delete</span></code>) functions.
2608 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DEFAULTED_FUNCTIONS</span></code>
2613 The compiler does not support defaulted (<code class="computeroutput"><span class="special">=</span>
2614 <span class="keyword">default</span></code>) functions.
2621 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS</span></code>
2626 The compiler does not support explicit conversion operators (<code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
2627 <span class="identifier">T</span><span class="special">()</span></code>).
2634 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_EXTERN_TEMPLATE</span></code>
2639 The compiler does not support explicit instantiation forward declarations
2640 for templates (<code class="computeroutput"><span class="keyword">extern</span> <span class="keyword">template</span> <span class="special">...</span></code>).
2647 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_FINAL</span></code>
2652 The compiler does not support the C++ class-virt-specifier final.
2659 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS</span></code>
2664 The compiler does not support expanding a variadic template parameter
2665 pack into a template containing one or more fixed arguments
2672 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS</span></code>
2677 The compiler does not support default template arguments for function
2685 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_ATOMIC</span></code>
2690 The standard library does not provide header <atomic>.
2697 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_ARRAY</span></code>
2702 The standard library does not provide header <array>.
2709 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_CHRONO</span></code>
2714 The standard library does not provide header <chrono>.
2721 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_CODECVT</span></code>
2726 The standard library does not provide header <codecvt>.
2733 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_CONDITION_VARIABLE</span></code>
2738 The standard library does not provide header <condition_variable>.
2745 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_FORWARD_LIST</span></code>
2750 The standard library does not provide header <forward_list>.
2757 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_FUNCTIONAL</span></code>
2762 The standard library does not provide a C++11 compatible version
2763 of <functional>.
2770 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_FUTURE</span></code>
2775 The standard library does not provide header <future>.
2782 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_INITIALIZER_LIST</span></code>
2787 The standard library does not provide header <initializer_list>.
2794 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_MUTEX</span></code>
2799 The standard library does not provide header <mutex>.
2806 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_RANDOM</span></code>
2811 The standard library does not provide header <random>.
2818 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_RATIO</span></code>
2823 The standard library does not provide header <ratio>.
2830 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_REGEX</span></code>
2835 The standard library does not provide header <regex>.
2842 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_SYSTEM_ERROR</span></code>
2847 The standard library does not provide header <system_error>.
2854 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_THREAD</span></code>
2859 The standard library does not provide header <thread>.
2866 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_TUPLE</span></code>
2871 The standard library does not provide header <tuple>.
2878 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_TYPEINDEX</span></code>
2883 The standard library does not provide header <typeindex>.
2890 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_TYPE_TRAITS</span></code>
2895 The standard library does not provide header <type_traits>.
2902 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_UNORDERED_MAP</span></code>
2907 The standard library does not provide header <unordered_map>.
2914 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_UNORDERED_SET</span></code>
2919 The standard library does not provide header <unordered_set>.
2926 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_INLINE_NAMESPACES</span></code>
2931 The compiler does not support inline namespaces.
2938 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_LAMBDAS</span></code>
2943 The compiler does not support Lambdas.
2950 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS</span></code>
2955 The compiler does not allow to pass local classes as template parameters
2956 (this macro intentionally does not control passing of unnamed types
2957 as template parameters, see also <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm" target="_top">N2657</a>).
2964 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS</span></code>
2969 The compiler does not support defaulted (<code class="computeroutput"><span class="special">=</span>
2970 <span class="keyword">default</span></code>) functions in access
2971 control sections other than <code class="computeroutput"><span class="keyword">public</span></code>.
2972 Public defaulted functions may still be supported, as indicated
2973 by <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DEFAULTED_FUNCTIONS</span></code>.
2974 Some compilers implementing an early draft of the C++11 standard
2975 (in particular, incorporating <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#906" target="_top">DR906</a>)
2976 are susceptible to this problem.
2983 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NOEXCEPT</span></code>
2988 The compiler does not support <code class="computeroutput"><span class="keyword">noexcept</span></code>.
2995 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NULLPTR</span></code>
3000 The compiler does not support <code class="computeroutput"><span class="keyword">nullptr</span></code>.
3007 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NUMERIC_LIMITS</span></code>
3012 The standard library <code class="computeroutput"><span class="special"><</span><span class="identifier">limits</span><span class="special">></span></code>
3013 header does not support the C++11 version of <code class="computeroutput"><span class="identifier">numeric_limits</span></code>.
3020 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_RANGE_BASED_FOR</span></code>
3025 The compiler does not support range-based for statements.
3032 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_RAW_LITERALS</span></code>
3037 The compiler does not support raw string literals.
3044 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_REF_QUALIFIERS</span></code>
3049 The compiler does not support ref-qualifiers on member functions
3050 as described in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm" target="_top">N2439</a>.
3057 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_RVALUE_REFERENCES</span></code>
3062 The compiler does not support r-value references.
3069 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_SCOPED_ENUMS</span></code>
3074 The compiler does not support scoped enumerations (<code class="computeroutput"><span class="keyword">enum</span> <span class="keyword">class</span></code>).
3081 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_SFINAE_EXPR</span></code>
3086 The compiler does not support usage of C++11 SFINAE with arbitrary
3087 expressions. Use this macro only if you are using all of the features
3088 of SFINAE including substitution-failure-on-private-member-access.
3089 Otherwise use BOOST_NO_SFINAE_EXPR or BOOST_NO_SFINAE which get
3090 defined for fewer compilers.
3097 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_SMART_PTR</span></code>
3102 The standard library header <memory> has no shared_ptr and
3110 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_STATIC_ASSERT</span></code>
3115 The compiler does not support <code class="computeroutput"><span class="keyword">static_assert</span></code>.
3122 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_STD_ALIGN</span></code>
3127 The standard library header <memory> has no working std::align.
3134 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_STD_UNORDERED</span></code>
3139 The standard library does not support <unordered_map> and
3140 <unordered_set>.
3147 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_TEMPLATE_ALIASES</span></code>
3152 The compiler does not support template aliases.
3159 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_THREAD_LOCAL</span></code>
3164 The compiler does not support the <code class="computeroutput"><span class="keyword">thread_local</span></code>
3172 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_TRAILING_RESULT_TYPES</span></code>
3177 The compiler does not support the new function result type specification
3178 syntax (e.g. <code class="computeroutput"><span class="keyword">auto</span> <span class="identifier">foo</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span>
3179 <span class="special">-></span> <span class="identifier">T</span><span class="special">;</span></code>).
3186 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_UNICODE_LITERALS</span></code>
3191 The compiler does not support Unicode (<code class="computeroutput"><span class="identifier">u8</span></code>,
3192 <code class="computeroutput"><span class="identifier">u</span></code>, <code class="computeroutput"><span class="identifier">U</span></code>) literals.
3199 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX</span></code>
3204 The compiler does not support the <a href="http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization" target="_top">C++11
3205 Unified Initialization Syntax</a>.
3212 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_USER_DEFINED_LITERALS</span></code>
3217 The compiler does not support user defined literals.
3224 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_VARIADIC_TEMPLATES</span></code>
3229 The compiler does not support variadic templates.
3236 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_VARIADIC_MACROS</span></code>
3241 The compiler does not support variadic macros.
3248 <code class="computeroutput"><span class="identifier">BOOST_NO_LONG_LONG</span></code>
3253 The compiler does not support <code class="computeroutput"><span class="keyword">long</span>
3254 <span class="keyword">long</span></code>.
3261 <div class="section">
3262 <div class="titlepage"><div><div><h3 class="title">
3263 <a name="boost_config.boost_macro_reference.macros_that_allow_use_of_c__11_features_with_c__03_compilers"></a><a name="config_11_for_03"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_allow_use_of_c__11_features_with_c__03_compilers" title="Macros that allow use of C++11 features with C++03 compilers">Macros
3264 that allow use of C++11 features with C++03 compilers</a>
3265 </h3></div></div></div>
3267 The following macros allow use of C++11 features even with compilers that
3268 do not yet provide compliant C++11 support.
3270 <div class="informaltable"><table class="table">
3291 <code class="computeroutput"><span class="identifier">BOOST_ALIGNMENT</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span></code>, <code class="computeroutput"><span class="identifier">BOOST_NO_ALIGNMENT</span></code>
3296 Some compilers don't support the <code class="computeroutput"><span class="keyword">alignas</span></code>
3297 keyword but provide other means to specify alignment (usually,
3298 through compiler-specific attributes). The macro <code class="computeroutput"><span class="identifier">BOOST_ALIGNMENT</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span></code>
3299 will expand to the <code class="computeroutput"><span class="keyword">alignas</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span></code> keyword if the compiler supports
3300 it or to some compiler-specific attribute to achieve the specified
3301 alignment. If no such compiler-specific attribute is known then
3302 <code class="computeroutput"><span class="identifier">BOOST_ALIGNMENT</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span></code> will expand to nothing and <code class="computeroutput"><span class="identifier">BOOST_NO_ALIGNMENT</span></code> will be defined.
3303 Unlike native <code class="computeroutput"><span class="keyword">alignas</span></code>,
3304 <code class="computeroutput"><span class="identifier">X</span></code> must always be
3305 a compile-time integer constant. The macro can be used to specify
3306 alignment of types and data:
3308 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">BOOST_ALIGNMENT</span><span class="special">(</span><span class="number">16</span><span class="special">)</span> <span class="identifier">my_data</span>
3309 <span class="special">{</span>
3310 <span class="keyword">char</span> <span class="identifier">c</span><span class="special">[</span><span class="number">16</span><span class="special">];</span>
3311 <span class="special">};</span>
3312 <span class="identifier">BOOST_ALIGNMENT</span><span class="special">(</span><span class="number">8</span><span class="special">)</span> <span class="keyword">int</span> <span class="identifier">arr</span><span class="special">[</span><span class="number">32</span><span class="special">];</span>
3321 <code class="computeroutput"><span class="identifier">BOOST_CONSTEXPR</span></code>
3326 Some compilers don't support the use of <code class="computeroutput"><span class="keyword">constexpr</span></code>.
3327 This macro expands to nothing on those compilers, and <code class="computeroutput"><span class="keyword">constexpr</span></code> elsewhere. For example,
3328 when defining a constexpr function or constructor replace:
3330 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">constexpr</span> <span class="identifier">tuple</span><span class="special">();</span>
3335 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">BOOST_CONSTEXPR</span> <span class="identifier">tuple</span><span class="special">();</span>
3344 <code class="computeroutput"><span class="identifier">BOOST_CONSTEXPR_OR_CONST</span></code>
3349 Some compilers don't support the use of <code class="computeroutput"><span class="keyword">constexpr</span></code>.
3350 This macro expands to <code class="computeroutput"><span class="keyword">const</span></code>
3351 on those compilers, and <code class="computeroutput"><span class="keyword">constexpr</span></code>
3352 elsewhere. For example, when defining const expr variables replace:
3354 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">UIntType</span> <span class="identifier">xor_mask</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
3359 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">static</span> <span class="identifier">BOOST_CONSTEXPR_OR_CONST</span> <span class="identifier">UIntType</span> <span class="identifier">xor_mask</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
3368 <code class="computeroutput"><span class="identifier">BOOST_STATIC_CONSTEXPR</span></code>
3373 This is a shortcut for <code class="computeroutput"><span class="keyword">static</span>
3374 <span class="identifier">BOOST_CONSTEXPR_OR_CONST</span></code>.
3375 For example, when defining const expr variables replace:
3377 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="identifier">UIntType</span> <span class="identifier">xor_mask</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
3382 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">BOOST_STATIC_CONSTEXPR</span> <span class="identifier">UIntType</span> <span class="identifier">xor_mask</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">;</span>
3391 <code class="computeroutput"><span class="identifier">BOOST_DEFAULTED_FUNCTION</span><span class="special">(</span><span class="identifier">fun</span><span class="special">,</span> <span class="identifier">body</span><span class="special">)</span></code>
3396 This macro is intended to be used within a class definition in
3397 order to declare a default implementation of function <code class="computeroutput"><span class="identifier">fun</span></code>. For the compilers that do
3398 not support C++11 defaulted functions the macro will expand into
3399 an inline function definition with the <code class="computeroutput"><span class="identifier">body</span></code>
3400 implementation. For example:
3402 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">my_struct</span>
3403 <span class="special">{</span>
3404 <span class="identifier">BOOST_DEFAULTED_FUNCTION</span><span class="special">(</span><span class="identifier">my_struct</span><span class="special">(),</span> <span class="special">{})</span>
3405 <span class="special">};</span>
3410 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">my_struct</span>
3411 <span class="special">{</span>
3412 <span class="identifier">my_struct</span><span class="special">()</span> <span class="special">=</span> <span class="keyword">default</span><span class="special">;</span>
3413 <span class="special">};</span>
3418 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">my_struct</span>
3419 <span class="special">{</span>
3420 <span class="identifier">my_struct</span><span class="special">()</span> <span class="special">{}</span>
3421 <span class="special">};</span>
3430 <code class="computeroutput"><span class="identifier">BOOST_DELETED_FUNCTION</span><span class="special">(</span><span class="identifier">fun</span><span class="special">)</span></code>
3435 This macro is intended to be used within a class definition in
3436 order to declare a deleted function <code class="computeroutput"><span class="identifier">fun</span></code>.
3437 For the compilers that do not support C++11 deleted functions the
3438 macro will expand into a private function declaration with no definition.
3439 Since the macro may change the access mode, it is recommended to
3440 use this macro at the end of the class definition. For example:
3442 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">noncopyable</span>
3443 <span class="special">{</span>
3444 <span class="identifier">BOOST_DELETED_FUNCTION</span><span class="special">(</span><span class="identifier">noncopyable</span><span class="special">(</span><span class="identifier">noncopyable</span> <span class="keyword">const</span><span class="special">&))</span>
3445 <span class="identifier">BOOST_DELETED_FUNCTION</span><span class="special">(</span><span class="identifier">noncopyable</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span><span class="identifier">noncopyable</span> <span class="keyword">const</span><span class="special">&))</span>
3446 <span class="special">};</span>
3451 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">noncopyable</span>
3452 <span class="special">{</span>
3453 <span class="identifier">noncopyable</span><span class="special">(</span><span class="identifier">noncopyable</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
3454 <span class="identifier">noncopyable</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span><span class="identifier">noncopyable</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
3455 <span class="special">};</span>
3460 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">noncopyable</span>
3461 <span class="special">{</span>
3462 <span class="keyword">private</span><span class="special">:</span>
3463 <span class="identifier">noncopyable</span><span class="special">(</span><span class="identifier">noncopyable</span> <span class="keyword">const</span><span class="special">&);</span>
3464 <span class="identifier">noncopyable</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span><span class="identifier">noncopyable</span> <span class="keyword">const</span><span class="special">&);</span>
3465 <span class="special">};</span>
3475 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">BOOST_NOEXCEPT</span>
3476 <span class="identifier">BOOST_NOEXCEPT_OR_NOTHROW</span>
3477 <span class="identifier">BOOST_NOEXCEPT_IF</span><span class="special">(</span><span class="identifier">Predicate</span><span class="special">)</span>
3478 <span class="identifier">BOOST_NOEXCEPT_EXPR</span><span class="special">(</span><span class="identifier">Expression</span><span class="special">)</span>
3485 If <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NOEXCEPT</span></code>
3486 is defined (i.e. C++03 compliant compilers) these macros are defined
3489 <div class="blockquote"><blockquote class="blockquote">
3492 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_NOEXCEPT</span>
3493 <span class="preprocessor">#define</span> <span class="identifier">BOOST_NOEXCEPT_OR_NOTHROW</span> <span class="keyword">throw</span><span class="special">()</span>
3494 <span class="preprocessor">#define</span> <span class="identifier">BOOST_NOEXCEPT_IF</span><span class="special">(</span><span class="identifier">Predicate</span><span class="special">)</span>
3495 <span class="preprocessor">#define</span> <span class="identifier">BOOST_NOEXCEPT_EXPR</span><span class="special">(</span><span class="identifier">Expression</span><span class="special">)</span> <span class="keyword">false</span>
3501 If <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NOEXCEPT</span></code>
3502 is not defined (i.e. C++11 compliant compilers) they are defined
3505 <div class="blockquote"><blockquote class="blockquote">
3508 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_NOEXCEPT</span> <span class="keyword">noexcept</span>
3509 <span class="preprocessor">#define</span> <span class="identifier">BOOST_NOEXCEPT_OR_NOTHROW</span> <span class="keyword">noexcept</span>
3510 <span class="preprocessor">#define</span> <span class="identifier">BOOST_NOEXCEPT_IF</span><span class="special">(</span><span class="identifier">Predicate</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">((</span><span class="identifier">Predicate</span><span class="special">))</span>
3511 <span class="preprocessor">#define</span> <span class="identifier">BOOST_NOEXCEPT_EXPR</span><span class="special">(</span><span class="identifier">Expression</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">((</span><span class="identifier">Expression</span><span class="special">))</span>
3521 <code class="computeroutput"><span class="identifier">BOOST_MSVC_ENABLE_2012_NOV_CTP</span></code>
3526 For Microsoft Visual C++ 2012, enable the C++11 features supplied
3527 by the November 2012 Community Technology Preview. These features
3528 are not automatically enabled because the CTP is non-supported
3529 alpha code that is not recommended for production use. This macro
3530 must be defined before including any Boost headers, and must be
3531 defined for all translation units in the program, including Boost
3532 library builds. This macro will no longer have any effect once
3533 an official Microsoft release supports the CTP features.
3540 <div class="section">
3541 <div class="titlepage"><div><div><h3 class="title">
3542 <a name="boost_config.boost_macro_reference.macros_that_describe_c__14_features_not_supported"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__14_features_not_supported" title="Macros that describe C++14 features not supported">Macros
3543 that describe C++14 features not supported</a>
3544 </h3></div></div></div>
3546 The following macros describe features in the 2014 ISO C++ standard, formerly
3547 known as C++0y, that are not yet supported by a particular compiler or library.
3549 <div class="informaltable"><table class="table">
3570 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_AGGREGATE_NSDMI</span></code>
3575 The compiler does not support member initializer for aggregates
3576 as in the following example:
3578 <div class="blockquote"><blockquote class="blockquote">
3581 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">Foo</span>
3582 <span class="special">{</span>
3583 <span class="keyword">int</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span> <span class="special">=</span> <span class="number">42</span><span class="special">;</span>
3584 <span class="special">};</span>
3586 <span class="identifier">Foo</span> <span class="identifier">foo</span> <span class="special">=</span> <span class="special">{</span> <span class="number">0</span> <span class="special">};</span>
3596 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_BINARY_LITERALS</span></code>
3601 The compiler does not binary literals (e.g. <code class="computeroutput"><span class="number">0</span><span class="identifier">b1010</span></code>).
3608 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_CONSTEXPR</span></code>
3613 The compiler does not support relaxed <code class="computeroutput"><span class="keyword">constexpr</span></code>.
3620 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_DECLTYPE_AUTO</span></code>
3625 The compiler does not support <code class="computeroutput"><span class="keyword">decltype</span><span class="special">(</span><span class="keyword">auto</span><span class="special">)</span></code>.
3632 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_DIGIT_SEPARATORS</span></code>
3637 The compiler does not support digit separators (e.g. <code class="computeroutput"><span class="number">1</span><span class="char">'000'</span><span class="number">000</span></code>).
3644 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_GENERIC_LAMBDAS</span></code>
3649 The compiler does not support generic lambda (e.g. <code class="computeroutput"><span class="special">[](</span><span class="keyword">auto</span>
3650 <span class="identifier">v</span><span class="special">){</span>
3651 <span class="special">}</span></code>).
3658 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_HDR_SHARED_MUTEX</span></code>
3663 The standard library does not provide header <shared_mutex>.
3670 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES</span></code>
3675 The compiler does not support initialized lambda capture (e.g.
3676 <code class="computeroutput"><span class="special">[</span><span class="identifier">foo</span>
3677 <span class="special">=</span> <span class="number">42</span><span class="special">]{</span> <span class="special">}</span></code>).
3684 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION</span></code>
3689 The compiler does not support return type deduction for normal
3690 functions (e.g. <code class="computeroutput"><span class="keyword">auto</span> <span class="identifier">f</span><span class="special">()</span>
3691 <span class="special">{</span> <span class="keyword">return</span>
3692 <span class="identifier">val</span><span class="special">;</span>
3693 <span class="special">}</span></code>).
3700 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX14_VARIABLE_TEMPLATES</span></code>
3705 The compiler does not support variable template (e.g. <code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="identifier">T</span>
3706 <span class="identifier">kibi</span> <span class="special">=</span>
3707 <span class="identifier">T</span><span class="special">(</span><span class="number">1024</span><span class="special">);</span></code>).
3714 <div class="section">
3715 <div class="titlepage"><div><div><h3 class="title">
3716 <a name="boost_config.boost_macro_reference.macros_that_allow_use_of_c__14_features_with_c__11_or_earlier_compilers"></a><a name="config_14_for_11"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_allow_use_of_c__14_features_with_c__11_or_earlier_compilers" title="Macros that allow use of C++14 features with C++11 or earlier compilers">Macros
3717 that allow use of C++14 features with C++11 or earlier compilers</a>
3718 </h3></div></div></div>
3720 The following macros allow use of C++14 features even with compilers that
3721 do not yet provide compliant C++14 support.
3723 <div class="informaltable"><table class="table">
3743 <code class="computeroutput"><span class="identifier">BOOST_CXX14_CONSTEXPR</span></code>
3748 This macro works similar to BOOST_CONSTEXPR, but expands to <code class="computeroutput"><span class="keyword">constexpr</span></code> only if the C++14 "relaxed"
3749 <code class="computeroutput"><span class="keyword">constexpr</span></code> is available.
3755 <div class="section">
3756 <div class="titlepage"><div><div><h3 class="title">
3757 <a name="boost_config.boost_macro_reference.macros_that_describe_c__17_features_not_supported"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__17_features_not_supported" title="Macros that describe C++17 features not supported">Macros
3758 that describe C++17 features not supported</a>
3759 </h3></div></div></div>
3761 The following macros describe features in the 2016 ISO C++ standard, formerly
3762 known as C++1z, that are not yet supported by a particular compiler or library.
3764 <div class="informaltable"><table class="table">
3784 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX17_STD_INVOKE</span></code>
3789 The compiler does not support <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke</span><span class="special">()</span></code>.
3795 <div class="section">
3796 <div class="titlepage"><div><div><h3 class="title">
3797 <a name="boost_config.boost_macro_reference.boost_helper_macros"></a><a name="config_helpers"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.boost_helper_macros" title="Boost Helper Macros">Boost
3799 </h3></div></div></div>
3801 The following macros are either simple helpers, or macros that provide workarounds
3802 for compiler/standard library defects.
3804 <div class="informaltable"><table class="table">
3825 <code class="computeroutput"><span class="identifier">BOOST_WORKAROUND</span></code>
3830 This macro is used where a compiler specific workaround is required
3831 that is not otherwise described by one of the other Boost.Config
3832 macros. To use the macro you must first
3834 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">workaround</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
3839 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#if</span> <span class="identifier">BOOST_WORKAROUND</span><span class="special">(</span><span class="identifier">MACRONAME</span><span class="special">,</span> <span class="identifier">CONDITION</span><span class="special">)</span>
3840 <span class="comment">// workaround code goes here...</span>
3841 <span class="preprocessor">#else</span>
3842 <span class="comment">// Standard conforming code goes here...</span>
3843 <span class="preprocessor">#endif</span>
3846 where <code class="computeroutput"><span class="identifier">MACRONAME</span></code>
3847 is a macro that usually describes the version number to be tested
3848 against, and <code class="computeroutput"><span class="identifier">CONDITION</span></code>
3849 is a comparison operator followed by a value. For example <code class="computeroutput"><span class="identifier">BOOST_WORKAROUND</span><span class="special">(</span><span class="identifier">BOOST_INTEL</span><span class="special">,</span>
3850 <span class="special"><=</span> <span class="number">1010</span><span class="special">)</span></code> would evaluate to <code class="computeroutput"><span class="number">1</span></code> for Intel C++ 10.1 and earlier.
3853 The macro can also be used with <code class="computeroutput"><span class="identifier">BOOST_TESTED_AT</span></code>
3854 if all current compiler versions exhibit the issue, but the issue
3855 is expected to be fixed at some later point.
3858 For example <code class="computeroutput"><span class="identifier">BOOST_WORKAROUND</span><span class="special">(</span><span class="identifier">__BORLANDC__</span><span class="special">,</span> <span class="identifier">BOOST_TESTED_AT</span><span class="special">(</span><span class="number">0x590</span><span class="special">))</span></code> would normally evaluate to <code class="computeroutput"><span class="number">1</span></code> for all values of <code class="computeroutput"><span class="identifier">__BORLANDC__</span></code> <span class="emphasis"><em>unless</em></span>
3859 the macro <code class="computeroutput"><span class="identifier">BOOST_DETECT_OUTDATED_WORKAROUNDS</span></code>
3860 is defined, in which case evaluates to <code class="computeroutput"><span class="special">(</span><span class="identifier">__BORLANDC__</span> <span class="special"><=</span>
3861 <span class="number">0x590</span><span class="special">)</span></code>.
3864 <span class="bold"><strong>Note</strong></span>: the ultimate source of documentation
3865 for this macro is in <a href="../../../../../boost/detail/workaround.hpp" target="_top">boost/detail/workaround.hpp</a>.
3872 <code class="computeroutput"><span class="identifier">BOOST_PREVENT_MACRO_SUBSTITUTION</span></code>
3877 Sometimes you have a function name with the same name as a C macro,
3878 for example "min" and "max" member functions,
3879 in which case one can prevent the function being expanded as a
3882 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">someclass</span><span class="special">.</span><span class="identifier">min</span> <span class="identifier">BOOST_PREVENT_MACRO_SUBSTITUTION</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">);</span>
3885 The following also works in most, but not all, contexts:
3887 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">(</span><span class="identifier">someclass</span><span class="special">.</span><span class="identifier">max</span><span class="special">)(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">);</span>
3896 <code class="computeroutput"><span class="identifier">BOOST_DEDUCED_TYPENAME</span></code>
3901 Some compilers don't support the use of typename for dependent
3902 types in deduced contexts. This macro expands to nothing on those
3903 compilers, and typename elsewhere. For example, replace: <code class="computeroutput"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span> <span class="keyword">void</span>
3904 <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span><span class="special">,</span>
3905 <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">type</span><span class="special">);</span></code> with: <code class="computeroutput"><span class="keyword">template</span>
3906 <span class="special"><</span><span class="keyword">class</span>
3907 <span class="identifier">T</span><span class="special">></span>
3908 <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">BOOST_DEDUCED_TYPENAME</span>
3909 <span class="identifier">T</span><span class="special">::</span><span class="identifier">type</span><span class="special">);</span></code>
3916 <code class="computeroutput"><span class="identifier">BOOST_HASH_MAP_HEADER</span></code>
3921 The header to include to get the SGI <code class="computeroutput"><span class="identifier">hash_map</span></code>
3922 class. This macro is only available if <code class="computeroutput"><span class="identifier">BOOST_HAS_HASH</span></code>
3930 <code class="computeroutput"><span class="identifier">BOOST_HASH_SET_HEADER</span></code>
3935 The header to include to get the SGI <code class="computeroutput"><span class="identifier">hash_set</span></code>
3936 class. This macro is only available if <code class="computeroutput"><span class="identifier">BOOST_HAS_HASH</span></code>
3944 <code class="computeroutput"><span class="identifier">BOOST_SLIST_HEADER</span></code>
3949 The header to include to get the SGI <code class="computeroutput"><span class="identifier">slist</span></code>
3950 class. This macro is only available if <code class="computeroutput"><span class="identifier">BOOST_HAS_SLIST</span></code>
3958 <code class="computeroutput"><span class="identifier">BOOST_STD_EXTENSION_NAMESPACE</span></code>
3963 The namespace used for std library extensions (hashtable classes
3971 <code class="computeroutput"><span class="identifier">BOOST_STATIC_CONSTANT</span><span class="special">(</span><span class="identifier">Type</span><span class="special">,</span> <span class="identifier">assignment</span><span class="special">)</span></code>
3976 On compilers which don't allow in-class initialization of static
3977 integral constant members, we must use enums as a workaround if
3978 we want the constants to be available at compile-time. This macro
3979 gives us a convenient way to declare such constants. For example
3982 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">foo</span><span class="special">{</span>
3983 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span>
3984 <span class="special">};</span>
3989 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">struct</span> <span class="identifier">foo</span><span class="special">{</span>
3990 <span class="identifier">BOOST_STATIC_CONSTANT</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">value</span> <span class="special">=</span> <span class="number">2</span><span class="special">);</span>
3991 <span class="special">};</span>
4000 <code class="computeroutput"><span class="identifier">BOOST_UNREACHABLE_RETURN</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span></code>
4005 Normally evaluates to nothing, but evaluates to return x; if the
4006 compiler requires a return, even when it can never be reached.
4013 <code class="computeroutput"><span class="identifier">BOOST_FALLTHROUGH</span></code>
4018 The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
4019 between switch labels:
4021 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">switch</span> <span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
4022 <span class="keyword">case</span> <span class="number">40</span><span class="special">:</span>
4023 <span class="keyword">case</span> <span class="number">41</span><span class="special">:</span>
4024 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">truth_is_out_there</span><span class="special">)</span> <span class="special">{</span>
4025 <span class="special">++</span><span class="identifier">x</span><span class="special">;</span>
4026 <span class="identifier">BOOST_FALLTHROUGH</span><span class="special">;</span> <span class="comment">// Use instead of/along with annotations in </span>
4027 <span class="comment">// comments. </span>
4028 <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
4029 <span class="keyword">return</span> <span class="identifier">x</span><span class="special">;</span>
4030 <span class="special">}</span>
4031 <span class="keyword">case</span> <span class="number">42</span><span class="special">:</span>
4032 <span class="special">...</span>
4035 As shown in the example above, the BOOST_FALLTHROUGH macro should
4036 be followed by a semicolon. It is designed to mimic control-flow
4037 statements like 'break;', so it can be placed in most places where
4038 'break;' can, but only if there are no statements on the execution
4039 path between it and the next switch label.
4042 When compiled with Clang >3.2 in C++11 mode, the BOOST_FALLTHROUGH
4043 macro is expanded to <code class="computeroutput"><span class="special">[[</span><span class="identifier">clang</span><span class="special">::</span><span class="identifier">fallthrough</span><span class="special">]]</span></code>
4044 attribute, which is analysed when performing switch labels fall-through
4045 diagnostic ('-Wimplicit-fallthrough'). See clang <a href="http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough" target="_top">documentation
4046 on language extensions for details.</a>
4049 When used with unsupported compilers, the BOOST_FALLTHROUGH macro
4050 has no effect on diagnostics.
4053 In either case this macro has no effect on runtime behavior and
4054 performance of code.
4061 <code class="computeroutput"><span class="identifier">BOOST_EXPLICIT_TEMPLATE_TYPE</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> <code class="computeroutput"><span class="identifier">BOOST_EXPLICIT_TEMPLATE_NON_TYPE</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span><span class="identifier">v</span><span class="special">)</span></code> <code class="computeroutput"><span class="identifier">BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> <code class="computeroutput"><span class="identifier">BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span><span class="identifier">v</span><span class="special">)</span></code>
4066 Some compilers silently "fold" different function template
4067 instantiations if some of the template parameters don't appear
4068 in the function parameter list. For instance:
4070 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
4071 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">ostream</span><span class="special">></span>
4072 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">typeinfo</span><span class="special">></span>
4074 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">></span>
4075 <span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span> <span class="special">{</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">n</span> <span class="special"><<</span> <span class="char">' '</span><span class="special">;</span> <span class="special">}</span>
4077 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
4078 <span class="keyword">void</span> <span class="identifier">g</span><span class="special">()</span> <span class="special">{</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="keyword">typeid</span><span class="special">(</span><span class="identifier">T</span><span class="special">).</span><span class="identifier">name</span><span class="special">()</span> <span class="special"><<</span> <span class="char">' '</span><span class="special">;</span> <span class="special">}</span>
4080 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
4081 <span class="identifier">f</span><span class="special"><</span><span class="number">1</span><span class="special">>();</span>
4082 <span class="identifier">f</span><span class="special"><</span><span class="number">2</span><span class="special">>();</span>
4084 <span class="identifier">g</span><span class="special"><</span><span class="keyword">int</span><span class="special">>();</span>
4085 <span class="identifier">g</span><span class="special"><</span><span class="keyword">double</span><span class="special">>();</span>
4086 <span class="special">}</span>
4089 incorrectly outputs <code class="literal">2 2 double double</code> on VC++
4090 6. These macros, to be used in the function parameter list, fix
4091 the problem without effects on the calling syntax. For instance,
4092 in the case above write:
4094 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">></span>
4095 <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">BOOST_EXPLICIT_TEMPLATE_NON_TYPE</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">n</span><span class="special">))</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
4097 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
4098 <span class="keyword">void</span> <span class="identifier">g</span><span class="special">(</span><span class="identifier">BOOST_EXPLICIT_TEMPLATE_TYPE</span><span class="special">(</span><span class="identifier">T</span><span class="special">))</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
4101 Beware that they can declare (for affected compilers) a dummy defaulted
4105 <span class="bold"><strong>a)</strong></span> should be always invoked <span class="bold"><strong>at the end</strong></span> of the parameter list
4108 <span class="bold"><strong>b)</strong></span> can't be used if your function
4109 template is multiply declared.
4112 Furthermore, in order to add any needed comma separator, an <code class="computeroutput"><span class="identifier">APPEND_</span><span class="special">*</span></code>
4113 version must be used when the macro invocation appears after a
4114 normal parameter declaration or after the invocation of another
4115 macro of this same group.
4122 <code class="computeroutput"><span class="identifier">BOOST_USE_FACET</span><span class="special">(</span><span class="identifier">Type</span><span class="special">,</span> <span class="identifier">loc</span><span class="special">)</span></code>
4127 When the standard library does not have a conforming <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">use_facet</span></code> there are various workarounds
4128 available, but they differ from library to library. This macro
4129 provides a consistent way to access a locale's facets. For example,
4130 replace: <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">use_facet</span><span class="special"><</span><span class="identifier">Type</span><span class="special">>(</span><span class="identifier">loc</span><span class="special">);</span></code>
4131 with: <code class="computeroutput"><span class="identifier">BOOST_USE_FACET</span><span class="special">(</span><span class="identifier">Type</span><span class="special">,</span> <span class="identifier">loc</span><span class="special">);</span></code> Note do not add a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span></code>
4132 prefix to the front of <code class="computeroutput"><span class="identifier">BOOST_USE_FACET</span></code>.
4139 <code class="computeroutput"><span class="identifier">BOOST_HAS_FACET</span><span class="special">(</span><span class="identifier">Type</span><span class="special">,</span> <span class="identifier">loc</span><span class="special">)</span></code>
4144 When the standard library does not have a comforming <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">has_facet</span></code> there are various workarounds
4145 available, but they differ from library to library. This macro
4146 provides a consistent way to check a locale's facets. For example,
4147 replace: <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">has_facet</span><span class="special"><</span><span class="identifier">Type</span><span class="special">>(</span><span class="identifier">loc</span><span class="special">);</span></code>
4148 with: <code class="computeroutput"><span class="identifier">BOOST_HAS_FACET</span><span class="special">(</span><span class="identifier">Type</span><span class="special">,</span> <span class="identifier">loc</span><span class="special">);</span></code> Note do not add a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span></code>
4149 prefix to the front of <code class="computeroutput"><span class="identifier">BOOST_HAS_FACET</span></code>.
4156 <code class="computeroutput"><span class="identifier">BOOST_NESTED_TEMPLATE</span></code>
4161 Member templates are supported by some compilers even though they
4162 can't use the <code class="computeroutput"><span class="identifier">A</span><span class="special">::</span><span class="keyword">template</span>
4163 <span class="identifier">member</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span></code>
4164 syntax, as a workaround replace: <code class="computeroutput"><span class="keyword">typedef</span>
4165 <span class="keyword">typename</span> <span class="identifier">A</span><span class="special">::</span><span class="keyword">template</span>
4166 <span class="identifier">rebind</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span>
4167 <span class="identifier">binder</span><span class="special">;</span></code>
4168 with: <code class="computeroutput"><span class="keyword">typedef</span> <span class="keyword">typename</span>
4169 <span class="identifier">A</span><span class="special">::</span><span class="identifier">BOOST_NESTED_TEMPLATE</span> <span class="identifier">rebind</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="identifier">binder</span><span class="special">;</span></code>
4176 <code class="computeroutput"><span class="identifier">BOOST_STRINGIZE</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span></code>
4181 Converts the parameter <code class="computeroutput"><span class="identifier">X</span></code>
4182 to a string after macro replacement on <code class="computeroutput"><span class="identifier">X</span></code>
4190 <code class="computeroutput"><span class="identifier">BOOST_JOIN</span><span class="special">(</span><span class="identifier">X</span><span class="special">,</span><span class="identifier">Y</span><span class="special">)</span></code>
4195 This piece of macro magic joins the two arguments together, even
4196 when one of the arguments is itself a macro (see 16.3.1 in C++
4197 standard). This is normally used to create a mangled name in combination
4198 with a predefined macro such a __LINE__.
4205 <code class="computeroutput"><span class="identifier">BOOST_RESTRICT</span></code>
4210 This macro can be used in place of the compiler specific variant
4211 of the C99 <code class="computeroutput"><span class="identifier">restrict</span></code>
4212 keyword to notify the compiler that, for the lifetime of the qualified
4213 pointer variable, only it and its derivative value will be used
4214 to gain access to the object it references. This limits the effect
4215 of pointer aliasing and helps the optimizers in generating better
4216 code. However, i this condition is violated, undefined behavior
4222 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">void</span> <span class="identifier">perform_computation</span><span class="special">(</span> <span class="keyword">float</span><span class="special">*</span> <span class="identifier">BOOST_RESTRICT</span> <span class="identifier">in</span><span class="special">,</span> <span class="keyword">float</span><span class="special">*</span> <span class="identifier">BOOST_RESTRICT</span> <span class="identifier">out</span> <span class="special">)</span>
4223 <span class="special">{</span>
4224 <span class="special">*</span><span class="identifier">out</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">in</span> <span class="special">*</span> <span class="number">0.5f</span><span class="special">;</span>
4225 <span class="special">}</span>
4234 <code class="computeroutput"><span class="identifier">BOOST_FORCEINLINE</span></code>
4239 This macro can be used in place of the <code class="computeroutput"><span class="keyword">inline</span></code>
4240 keyword to instruct the compiler that the function should always
4241 be inlined. Overuse of this macro can lead to significant bloat,
4242 while good use can increase performance in certain cases, such
4243 as computation-intensive code built through generative programming
4249 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
4250 <span class="identifier">BOOST_FORCEINLINE</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">T</span><span class="special">&</span> <span class="identifier">t</span><span class="special">)</span>
4251 <span class="special">{</span>
4252 <span class="keyword">return</span> <span class="identifier">t</span><span class="special">;</span>
4253 <span class="special">}</span>
4258 Note that use of this macro can lead to cryptic error messages
4259 with some compilers. Consider defining it to <code class="computeroutput"><span class="keyword">inline</span></code>
4260 before including the Boost.Config header in order to be able to
4261 debug errors more easily.
4268 <code class="computeroutput"><span class="identifier">BOOST_NOINLINE</span></code>
4273 This macro can be used in place of the <code class="computeroutput"><span class="keyword">inline</span></code>
4274 keyword to instruct the compiler that the function should never
4275 be inlined. One should typically use this macro to mark functions
4276 that are unlikely to be called, such as error handling routines.
4281 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">BOOST_NOINLINE</span> <span class="keyword">void</span> <span class="identifier">handle_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">descr</span><span class="special">)</span>
4282 <span class="special">{</span>
4283 <span class="comment">// ...</span>
4284 <span class="special">}</span>
4293 <code class="computeroutput"><span class="identifier">BOOST_NORETURN</span></code>
4298 This macro can be used before the function declaration or definition
4299 to instruct the compiler that the function does not return normally
4300 (i.e. with a <code class="computeroutput"><span class="keyword">return</span></code>
4301 statement or by leaving the function scope, if the function return
4302 type is <code class="computeroutput"><span class="keyword">void</span></code>). The
4303 macro can be used to mark functions that always throw exceptions
4304 or terminate the application. Compilers that support this markup
4305 may use this information to specifically organize the code surrounding
4306 calls to this function and suppress warnings about missing <code class="computeroutput"><span class="keyword">return</span></code> statements in the functions
4307 enclosing such calls.
4312 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">BOOST_NORETURN</span> <span class="keyword">void</span> <span class="identifier">on_error_occurred</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">descr</span><span class="special">)</span>
4313 <span class="special">{</span>
4314 <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span><span class="special">(</span><span class="identifier">descr</span><span class="special">);</span>
4315 <span class="special">}</span>
4320 If the compiler does not support this markup, <code class="computeroutput"><span class="identifier">BOOST_NORETURN</span></code>
4321 is defined empty and an additional macro <code class="computeroutput"><span class="identifier">BOOST_NO_NORETURN</span></code>
4329 <code class="computeroutput"><span class="identifier">BOOST_LIKELY</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span></code>
4330 <code class="computeroutput"><span class="identifier">BOOST_UNLIKELY</span><span class="special">(</span><span class="identifier">X</span><span class="special">)</span></code>
4335 These macros communicate to the compiler that the conditional expression
4336 <code class="computeroutput"><span class="identifier">X</span></code> is likely or
4337 unlikely to yield a positive result. The expression should result
4338 in a boolean value. The result of the macro is an integer or boolean
4339 value equivalent to the result of <code class="computeroutput"><span class="identifier">X</span></code>.
4342 The macros are intended to be used in branching statements. The
4343 additional hint they provide can be used by the compiler to arrange
4344 the compiled code of the branches more effectively.
4349 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">BOOST_UNLIKELY</span><span class="special">(</span><span class="identifier">ptr</span> <span class="special">==</span> <span class="identifier">NULL</span><span class="special">))</span>
4350 <span class="identifier">handle_error</span><span class="special">(</span><span class="string">"ptr is NULL"</span><span class="special">);</span>
4359 <code class="computeroutput"><span class="identifier">BOOST_ATTRIBUTE_UNUSED</span></code>
4364 Expands to <code class="computeroutput"><span class="identifier">__attribute__</span><span class="special">((</span><span class="identifier">unused</span><span class="special">))</span></code> when this is available - can
4365 be used to disable compiler warnings relating to unused types or
4373 <div class="section">
4374 <div class="titlepage"><div><div><h3 class="title">
4375 <a name="boost_config.boost_macro_reference.boost_informational_macros"></a><a name="config_info_macros"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.boost_informational_macros" title="Boost Informational Macros">Boost
4376 Informational Macros</a>
4377 </h3></div></div></div>
4379 The following macros describe boost features; these are, generally speaking
4380 the only boost macros that should be tested in user code.
4382 <div class="informaltable"><table class="table">
4409 <code class="computeroutput"><span class="identifier">BOOST_VERSION</span></code>
4414 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">version</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4419 Describes the boost version number in XYYYZZ format such that:
4420 <code class="computeroutput"><span class="special">(</span><span class="identifier">BOOST_VERSION</span>
4421 <span class="special">%</span> <span class="number">100</span><span class="special">)</span></code> is the sub-minor version, <code class="computeroutput"><span class="special">((</span><span class="identifier">BOOST_VERSION</span>
4422 <span class="special">/</span> <span class="number">100</span><span class="special">)</span> <span class="special">%</span> <span class="number">1000</span><span class="special">)</span></code>
4423 is the minor version, and <code class="computeroutput"><span class="special">(</span><span class="identifier">BOOST_VERSION</span> <span class="special">/</span>
4424 <span class="number">100000</span><span class="special">)</span></code>
4425 is the major version.
4432 <code class="computeroutput"><span class="identifier">BOOST_NO_INT64_T</span></code>
4437 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">cstdint</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stdint</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
4442 Defined if there are no 64-bit integral types: <code class="computeroutput"><span class="identifier">int64_t</span></code>,
4443 <code class="computeroutput"><span class="identifier">uint64_t</span></code> etc.
4450 <code class="computeroutput"><span class="identifier">BOOST_NO_INTEGRAL_INT64_T</span></code>
4455 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">cstdint</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stdint</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span></code>
4460 Defined if <code class="computeroutput"><span class="identifier">int64_t</span></code>
4461 as defined by <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">cstdint</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4462 is not usable in integral constant expressions.
4469 <code class="computeroutput"><span class="identifier">BOOST_MSVC</span></code>
4474 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4479 Defined if the compiler is really Microsoft Visual C++, as opposed
4480 to one of the many other compilers that also define <code class="computeroutput"><span class="identifier">_MSC_VER</span></code>. Has the same value
4488 <code class="computeroutput"><span class="identifier">BOOST_MSVC_FULL_VER</span></code>
4493 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4498 Defined to a normalised 9 digit version of _MSC_FULL_VER (which
4499 sometimes only has 8 digits), the macro has the form VVMMPPPPP
4500 where VV is the major version number, MM is the minor version number,
4501 and PPPPP is the compiler build number.
4508 <code class="computeroutput"><span class="identifier">BOOST_GCC</span></code>
4513 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4518 Defined if the compiler is really GCC, as opposed to one of the
4519 many other compilers that also define <code class="computeroutput"><span class="identifier">__GNUC__</span></code>.
4520 Has the value: <code class="computeroutput"><span class="identifier">__GNUC__</span>
4521 <span class="special">*</span> <span class="number">10000</span>
4522 <span class="special">+</span> <span class="identifier">__GNUC_MINOR__</span>
4523 <span class="special">*</span> <span class="number">100</span>
4524 <span class="special">+</span> <span class="identifier">__GNUC_PATCHLEVEL__</span></code>.
4531 <code class="computeroutput"><span class="identifier">BOOST_INTEL</span></code>
4536 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4541 Defined if the compiler is an Intel compiler, takes the same value
4542 as the compiler version macro.
4549 <code class="computeroutput"><span class="identifier">BOOST_CLANG</span></code>
4554 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4559 Defined to 1 if the compiler is the Clang compiler.
4566 <code class="computeroutput"><span class="identifier">BOOST_WINDOWS</span></code>
4571 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4576 Defined if the Windows platform API is available.
4583 <code class="computeroutput"><span class="identifier">BOOST_DINKUMWARE_STDLIB</span></code>
4588 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4593 Defined if the dinkumware standard library is in use, takes the
4594 same value as the Dinkumware library version macro <code class="computeroutput"><span class="identifier">_CPPLIB_VER</span></code> if defined, otherwise
4602 <code class="computeroutput"><span class="identifier">BOOST_NO_WREGEX</span></code>
4607 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">regex</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4612 Defined if the regex library does not support wide character regular
4620 <code class="computeroutput"><span class="identifier">BOOST_COMPILER</span></code>
4625 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4630 Defined as a string describing the name and version number of the
4631 compiler in use. Mainly for debugging the configuration.
4638 <code class="computeroutput"><span class="identifier">BOOST_STDLIB</span></code>
4643 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4648 Defined as a string describing the name and version number of the
4649 standard library in use. Mainly for debugging the configuration.
4656 <code class="computeroutput"><span class="identifier">BOOST_PLATFORM</span></code>
4661 <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
4666 Defined as a string describing the name of the platform. Mainly
4667 for debugging the configuration.
4674 <div class="section">
4675 <div class="titlepage"><div><div><h3 class="title">
4676 <a name="boost_config.boost_macro_reference.boost_deprecated_macros"></a><a name="deprecated_macros"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.boost_deprecated_macros" title="Boost Deprecated Macros">Boost
4677 Deprecated Macros</a>
4678 </h3></div></div></div>
4680 The following have been deprecated; please use the replacements instead.
4681 They will be removed in a future version of boost.
4683 <div class="informaltable"><table class="table">
4716 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_ARRAY</span></code>
4721 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_ARRAY</span></code>
4735 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_CHRONO</span></code>
4740 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_CHRONO</span></code>
4754 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_CODECVT</span></code>
4759 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_CODECVT</span></code>
4773 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_CONDITION_VARIABLE</span></code>
4778 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_CONDITION_VARIABLE</span></code>
4792 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_FORWARD_LIST</span></code>
4797 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_FORWARD_LIST</span></code>
4811 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_FUTURE</span></code>
4816 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_FUTURE</span></code>
4830 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_INITIALIZER_LIST</span></code>
4835 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_INITIALIZER_LIST</span></code>
4849 <code class="computeroutput"><span class="identifier">BOOST_NO_INITIALIZER_LISTS</span></code>
4854 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_INITIALIZER_LIST</span></code>
4868 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_MUTEX</span></code>
4873 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_MUTEX</span></code>
4887 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_RANDOM</span></code>
4892 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_RANDOM</span></code>
4906 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_RATIO</span></code>
4911 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_RATIO</span></code>
4925 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_REGEX</span></code>
4930 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_REGEX</span></code>
4944 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_SYSTEM_ERROR</span></code>
4949 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_SYSTEM_ERROR</span></code>
4963 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_THREAD</span></code>
4968 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_THREAD</span></code>
4982 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_TUPLE</span></code>
4987 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_TUPLE</span></code>
5001 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_TYPE_TRAITS</span></code>
5006 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_TYPE_TRAITS</span></code>
5020 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_TYPEINDEX</span></code>
5025 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_TYPEINDEX</span></code>
5039 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_UNORDERED_SET</span></code>
5044 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_UNORDERED_SET</span></code>
5058 <code class="computeroutput"><span class="identifier">BOOST_NO_0X_HDR_UNORDERED_MAP</span></code>
5063 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_UNORDERED_MAP</span></code>
5077 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_UNORDERED</span></code>
5082 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_HDR_UNORDERED_SET</span></code>
5106 <code class="computeroutput"><span class="identifier">BOOST_NO_AUTO_DECLARATIONS</span></code>
5111 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_AUTO_DECLARATIONS</span></code>
5125 <code class="computeroutput"><span class="identifier">BOOST_NO_AUTO_MULTIDECLARATIONS</span></code>
5130 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS</span></code>
5144 <code class="computeroutput"><span class="identifier">BOOST_NO_CHAR16_T</span></code>
5149 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CHAR16_T</span></code>
5163 <code class="computeroutput"><span class="identifier">BOOST_NO_CHAR32_T</span></code>
5168 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CHAR32_T</span></code>
5182 <code class="computeroutput"><span class="identifier">BOOST_NO_TEMPLATE_ALIASES</span></code>
5187 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_TEMPLATE_ALIASES</span></code>
5201 <code class="computeroutput"><span class="identifier">BOOST_NO_CONSTEXPR</span></code>
5206 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CONSTEXPR</span></code>
5220 <code class="computeroutput"><span class="identifier">BOOST_NO_DECLTYPE</span></code>
5225 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DECLTYPE</span></code>
5239 <code class="computeroutput"><span class="identifier">BOOST_NO_DECLTYPE_N3276</span></code>
5244 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DECLTYPE_N3276</span></code>
5258 <code class="computeroutput"><span class="identifier">BOOST_NO_DEFAULTED_FUNCTIONS</span></code>
5263 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DEFAULTED_FUNCTIONS</span></code>
5277 <code class="computeroutput"><span class="identifier">BOOST_NO_DELETED_FUNCTIONS</span></code>
5282 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_DELETED_FUNCTIONS</span></code>
5296 <code class="computeroutput"><span class="identifier">BOOST_NO_EXPLICIT_CONVERSION_OPERATORS</span></code>
5301 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS</span></code>
5315 <code class="computeroutput"><span class="identifier">BOOST_NO_EXTERN_TEMPLATE</span></code>
5320 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_EXTERN_TEMPLATE</span></code>
5334 <code class="computeroutput"><span class="identifier">BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS</span></code>
5339 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS</span></code>
5353 <code class="computeroutput"><span class="identifier">BOOST_NO_LAMBDAS</span></code>
5358 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_LAMBDAS</span></code>
5372 <code class="computeroutput"><span class="identifier">BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS</span></code>
5377 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS</span></code>
5391 <code class="computeroutput"><span class="identifier">BOOST_NO_NOEXCEPT</span></code>
5396 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NOEXCEPT</span></code>
5410 <code class="computeroutput"><span class="identifier">BOOST_NO_NULLPTR</span></code>
5415 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NULLPTR</span></code>
5429 <code class="computeroutput"><span class="identifier">BOOST_NO_RAW_LITERALS</span></code>
5434 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_RAW_LITERALS</span></code>
5448 <code class="computeroutput"><span class="identifier">BOOST_NO_RVALUE_REFERENCES</span></code>
5453 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_RVALUE_REFERENCES</span></code>
5467 <code class="computeroutput"><span class="identifier">BOOST_NO_SCOPED_ENUMS</span></code>
5472 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_SCOPED_ENUMS</span></code>
5486 <code class="computeroutput"><span class="identifier">BOOST_NO_STATIC_ASSERT</span></code>
5491 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_STATIC_ASSERT</span></code>
5505 <code class="computeroutput"><span class="identifier">BOOST_NO_STD_UNORDERED</span></code>
5510 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_STD_UNORDERED</span></code>
5524 <code class="computeroutput"><span class="identifier">BOOST_NO_UNICODE_LITERALS</span></code>
5529 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_UNICODE_LITERALS</span></code>
5543 <code class="computeroutput"><span class="identifier">BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX</span></code>
5548 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX</span></code>
5562 <code class="computeroutput"><span class="identifier">BOOST_NO_VARIADIC_TEMPLATES</span></code>
5567 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_VARIADIC_TEMPLATES</span></code>
5581 <code class="computeroutput"><span class="identifier">BOOST_NO_VARIADIC_MACROS</span></code>
5586 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_VARIADIC_MACROS</span></code>
5600 <code class="computeroutput"><span class="identifier">BOOST_NO_NUMERIC_LIMITS_LOWEST</span></code>
5605 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_NUMERIC_LIMITS</span></code>
5629 <code class="computeroutput"><span class="identifier">BOOST_HAS_STATIC_ASSERT</span></code>
5634 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_STATIC_ASSERT</span></code>
5649 <code class="computeroutput"><span class="identifier">BOOST_HAS_VARIADIC_TMPL</span></code>
5654 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_VARIADIC_TEMPLATES</span></code>
5669 <code class="computeroutput"><span class="identifier">BOOST_HAS_RVALUE_REFS</span></code>
5674 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_RVALUE_REFERENCES</span></code>
5689 <code class="computeroutput"><span class="identifier">BOOST_HAS_CHAR16_T</span></code>
5694 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CHAR16_T</span></code>
5709 <code class="computeroutput"><span class="identifier">BOOST_HAS_CHAR32_T</span></code>
5714 <code class="computeroutput"><span class="identifier">BOOST_NO_CXX11_CHAR32_T</span></code>
5729 <div class="section">
5730 <div class="titlepage"><div><div><h3 class="title">
5731 <a name="boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code" title="Macros for libraries with separate source code">Macros
5732 for libraries with separate source code</a>
5733 </h3></div></div></div>
5734 <div class="toc"><dl class="toc">
5735 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.macros_controlling_shared_library_symbol_visibility">Macros
5736 controlling shared library symbol visibility</a></span></dt>
5737 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.abi_fixing">ABI
5738 Fixing</a></span></dt>
5739 <dt><span class="section"><a href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.automatic_library_selection">Automatic
5740 library selection</a></span></dt>
5743 The following macros and helper headers are of use to authors whose libraries
5744 include separate source code, and are intended to address several issues:
5746 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
5747 <li class="listitem">
5748 Controlling shared library symbol visibility
5750 <li class="listitem">
5751 Fixing the ABI of the compiled library
5753 <li class="listitem">
5754 Selecting which compiled library to link against based upon the compilers
5759 See <a href="http://www.boost.org/development/separate_compilation.html" target="_top">Guidelines
5760 for Authors of Boost Libraries Containing Separate Source</a>
5762 <div class="section">
5763 <div class="titlepage"><div><div><h4 class="title">
5764 <a name="boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.macros_controlling_shared_library_symbol_visibility"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.macros_controlling_shared_library_symbol_visibility" title="Macros controlling shared library symbol visibility">Macros
5765 controlling shared library symbol visibility</a>
5766 </h4></div></div></div>
5768 Some compilers support C++ extensions that control which symbols will be
5769 exported from shared libraries such as dynamic shared objects (DSO's) on
5770 Unix-like systems or dynamic-link libraries (DLL's) on Windows.
5773 The Microsoft VC++ compiler has long supplied <code class="computeroutput"><span class="identifier">__declspec</span><span class="special">(</span><span class="identifier">dllexport</span><span class="special">)</span></code> and <code class="computeroutput"><span class="identifier">__declspec</span><span class="special">(</span><span class="identifier">dllimport</span><span class="special">)</span></code> extensions for this purpose, as do virtually
5774 all other compilers targeting the Windows platform.
5777 Modern versions of the GNU GCC compiler provide the <code class="computeroutput"><span class="identifier">__attribute__</span><span class="special">((</span><span class="identifier">visibility</span><span class="special">(</span><span class="string">"default"</span><span class="special">)))</span></code> extension to indicate that a symbol
5778 should be exported. All other symbols may be hidden by using the <code class="computeroutput"><span class="special">-</span><span class="identifier">fvisibility</span><span class="special">-</span><span class="identifier">hidden</span></code>
5779 or <code class="computeroutput"><span class="special">-</span><span class="identifier">fvisibility</span><span class="special">-</span><span class="identifier">ms</span><span class="special">-</span><span class="identifier">compat</span></code> compiler switches.
5782 Boost supplies several macros to make it easier to manage symbol visibility
5783 in a way that is portable between compilers and operating systems.
5785 <div class="informaltable"><table class="table">
5806 <code class="computeroutput"><span class="identifier">BOOST_SYMBOL_EXPORT</span></code>
5811 Defines the syntax of a C++ language extension that indicates
5812 a symbol is to be exported from a shared library. If the compiler
5813 has no such extension, the macro is defined with no replacement
5821 <code class="computeroutput"><span class="identifier">BOOST_SYMBOL_IMPORT</span></code>
5826 Defines the syntax of a C++ language extension that indicates
5827 a symbol is to be imported from a shared library. If the compiler
5828 has no such extension, the macro is defined with no replacement
5836 <code class="computeroutput"><span class="identifier">BOOST_SYMBOL_VISIBLE</span></code>
5841 Defines the syntax of a C++ language extension that indicates
5842 a symbol is to be globally visible. If the compiler has no such
5843 extension, the macro is defined with no replacement text. Needed
5844 for classes that are not otherwise exported, but are used by
5845 RTTI. Examples include class for objects that will be thrown
5846 as exceptions or used in dynamic_casts, across shared library
5847 boundaries. For example, a header-only exception class might
5850 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">class</span> <span class="identifier">BOOST_SYMBOL_VISIBLE</span> <span class="identifier">my_exception</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>
5853 Without BOOST_SYMBOL_VISIBLE, it would be impossible to catch
5854 my_exception thrown from a shared library compiled by GCC with
5855 the -fvisibility=hidden option.
5862 <code class="computeroutput"><span class="identifier">BOOST_HAS_DECLSPEC</span></code>
5867 The compiler has C++ extensions <code class="computeroutput"><span class="identifier">__declspec</span><span class="special">(</span><span class="identifier">dllexport</span><span class="special">)</span></code> and <code class="computeroutput"><span class="identifier">__declspec</span><span class="special">(</span><span class="identifier">dllimport</span><span class="special">)</span></code> to control export/import of
5868 symbols from shared libraries. <span class="emphasis"><em>Deprecated. This macro
5869 is no longer necessary since BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT
5870 are now supplied. It is provided to support legacy code.</em></span>
5880 <span class="bold"><strong>boost/foo/config.hpp</strong></span>
5882 <pre class="programlisting"><span class="special">...</span>
5883 <span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_ALL_DYN_LINK</span><span class="special">)</span> <span class="special">||</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_FOO_DYN_LINK</span><span class="special">)</span>
5884 <span class="preprocessor"># if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_FOO_SOURCE</span><span class="special">)</span>
5885 <span class="preprocessor"># define</span> <span class="identifier">BOOST_FOO_DECL</span> <span class="identifier">BOOST_SYMBOL_EXPORT</span>
5886 <span class="preprocessor"># else</span>
5887 <span class="preprocessor"># define</span> <span class="identifier">BOOST_FOO_DECL</span> <span class="identifier">BOOST_SYMBOL_IMPORT</span>
5888 <span class="preprocessor"># endif</span>
5889 <span class="preprocessor">#else</span>
5890 <span class="preprocessor"># define</span> <span class="identifier">BOOST_FOO_DECL</span>
5891 <span class="preprocessor">#endif</span>
5892 <span class="special">...</span>
5895 <span class="bold"><strong>boost/foo/foo.hpp</strong></span>
5897 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">foo</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
5898 <span class="special">...</span>
5899 <span class="keyword">class</span> <span class="identifier">BOOST_FOO_DECL</span> <span class="identifier">bar</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>
5900 <span class="special">...</span>
5901 <span class="keyword">void</span> <span class="identifier">BOOST_FOO_DECL</span> <span class="identifier">f</span><span class="special">();</span>
5902 <span class="special">...</span>
5905 <span class="bold"><strong>boost/libs/foo/src/foo.cpp</strong></span>
5907 <pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_FOO_SOURCE</span>
5908 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">foo</span><span class="special">/</span><span class="identifier">foo</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
5909 <span class="special">...</span>
5910 <span class="keyword">void</span> <span class="identifier">BOOST_FOO_DECL</span> <span class="identifier">f</span><span class="special">()</span>
5911 <span class="special">{</span>
5912 <span class="special">...</span>
5913 <span class="special">}</span>
5914 <span class="special">...</span>
5917 <div class="section">
5918 <div class="titlepage"><div><div><h4 class="title">
5919 <a name="boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.abi_fixing"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.abi_fixing" title="ABI Fixing">ABI
5921 </h4></div></div></div>
5923 When linking against a pre-compiled library it vital that the ABI used
5924 by the compiler when building the library <span class="emphasis"><em>matches exactly</em></span>
5925 the ABI used by the code using the library. In this case ABI means things
5926 like the struct packing arrangement used, the name mangling scheme used,
5927 or the size of some types (enum types for example). This is separate from
5928 things like threading support, or runtime library variations, which have
5929 to be dealt with by build variants. To put this in perspective there is
5930 one compiler (Borland's) that has so many compiler options that make subtle
5931 changes to the ABI, that at least in theory there 3200 combinations, and
5932 that's without considering runtime library variations. Fortunately these
5933 variations can be managed by <code class="computeroutput"><span class="preprocessor">#pragma</span></code>'s
5934 that tell the compiler what ABI to use for the types declared in your library.
5935 In order to avoid sprinkling <code class="computeroutput"><span class="preprocessor">#pragma</span></code>'s
5936 all over the boost headers, there are some prefix and suffix headers that
5937 do the job. Typical usage is:
5940 <span class="bold"><strong>my_library.hpp</strong></span>
5942 <pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">MY_INCLUDE_GUARD</span>
5943 <span class="preprocessor">#define</span> <span class="identifier">MY_INCLUDE_GUARD</span>
5945 <span class="comment">// all includes go here:</span>
5946 <code class="literal"><span class="bold"><strong>#include <boost/config.hpp></strong></span></code>
5947 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">whatever</span><span class="special">></span>
5949 <code class="literal"><span class="bold"><strong>#include <boost/config/abi_prefix.hpp></strong></span></code> <span class="comment">// must be the last #include</span>
5951 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
5953 <span class="comment">// your code goes here</span>
5955 <span class="special">}</span>
5957 <code class="literal"><span class="bold"><strong>#include <boost/config/abi_suffix.hpp></strong></span></code> <span class="comment">// pops abi_prefix.hpp pragmas</span>
5959 <span class="preprocessor">#endif</span> <span class="comment">// include guard</span>
5962 <span class="bold"><strong>my_library.cpp</strong></span>
5964 <pre class="programlisting"><span class="special">...</span>
5965 <span class="comment">// nothing special need be done in the implementation file</span>
5966 <span class="special">...</span>
5969 The user can disable this mechanism by defining <code class="computeroutput"><span class="identifier">BOOST_DISABLE_ABI_HEADERS</span></code>,
5970 or they can define <code class="computeroutput"><span class="identifier">BOOST_ABI_PREFIX</span></code>
5971 and/or <code class="computeroutput"><span class="identifier">BOOST_ABI_SUFFIX</span></code>
5972 to point to their own prefix/suffix headers if they so wish.
5975 <div class="section">
5976 <div class="titlepage"><div><div><h4 class="title">
5977 <a name="boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.automatic_library_selection"></a><a class="link" href="boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code.automatic_library_selection" title="Automatic library selection">Automatic
5978 library selection</a>
5979 </h4></div></div></div>
5981 It is essential that users link to a build of a library which was built
5982 against the same runtime library that their application will be built against
5983 -if this does not happen then the library will not be binary compatible
5984 with their own code- and there is a high likelihood that their application
5985 will experience runtime crashes. These kinds of problems can be extremely
5986 time consuming and difficult to debug, and often lead to frustrated users
5987 and authors alike (simply selecting the right library to link against is
5988 not as easy as it seems when their are 6-8 of them to chose from, and some
5989 users seem to be blissfully unaware that there even are different runtimes
5993 To solve this issue, some compilers allow source code to contain <code class="computeroutput"><span class="preprocessor">#pragma</span></code>'s that instruct the linker
5994 which library to link against, all the user need do is include the headers
5995 they need, place the compiled libraries in their library search path, and
5996 the compiler and linker do the rest. Boost.config supports this via the
5997 header <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">/</span><span class="identifier">auto_link</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>, before including this header one or
5998 more of the following macros need to be defined:
6000 <div class="variablelist">
6001 <p class="title"><b></b></p>
6002 <dl class="variablelist">
6003 <dt><span class="term"><code class="computeroutput"><span class="identifier">BOOST_LIB_NAME</span></code></span></dt>
6005 Required: An identifier containing the basename of the library, for
6006 example 'boost_regex'.
6008 <dt><span class="term"><code class="computeroutput"><span class="identifier">BOOST_DYN_LINK</span></code></span></dt>
6010 Optional: when set link to dll rather than static library.
6012 <dt><span class="term"><code class="computeroutput"><span class="identifier">BOOST_LIB_DIAGNOSTIC</span></code></span></dt>
6014 Optional: when set the header will print out the name of the library
6015 selected (useful for debugging).
6020 If the compiler supports this mechanism, then it will be told to link against
6021 the appropriately named library, the actual algorithm used to mangle the
6022 name of the library is documented inside <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">/</span><span class="identifier">auto_link</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
6023 and has to match that used to create the libraries via bjam 's install
6027 <span class="bold"><strong>my_library.hpp</strong></span>
6029 <pre class="programlisting"><span class="special">...</span>
6030 <span class="comment">//</span>
6031 <span class="comment">// Don't include auto-linking code if the user has disabled it by</span>
6032 <span class="comment">// defining BOOST_ALL_NO_LIB, or BOOST_MY_LIBRARY_NO_LIB, or if this </span>
6033 <span class="comment">// is one of our own source files (signified by BOOST_MY_LIBRARY_SOURCE):</span>
6034 <span class="comment">//</span>
6035 <span class="preprocessor">#if</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_ALL_NO_LIB</span><span class="special">)</span> <span class="special">&&</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_MY_LIBRARY_NO_LIB</span><span class="special">)</span> <span class="special">&&</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_MY_LIBRARY_SOURCE</span><span class="special">)</span>
6036 <span class="preprocessor"># define</span> <span class="identifier">BOOST_LIB_NAME</span> <span class="identifier">boost_my_library</span>
6037 <span class="preprocessor"># ifdef</span> <span class="identifier">BOOST_MY_LIBRARY_DYN_LINK</span>
6038 <span class="preprocessor"># define</span> <span class="identifier">BOOST_DYN_LINK</span>
6039 <span class="preprocessor"># endif</span>
6040 <span class="preprocessor"># include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">/</span><span class="identifier">auto_link</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6041 <span class="preprocessor">#endif</span>
6042 <span class="special">...</span>
6045 <span class="bold"><strong>my_library.cpp</strong></span>
6047 <pre class="programlisting"><span class="comment">// define BOOST_MY_LIBRARY_SOURCE so that the header knows that the</span>
6048 <span class="comment">// library is being built (possibly exporting rather than importing code)</span>
6049 <span class="comment">//</span>
6050 <span class="preprocessor">#define</span> <span class="identifier">BOOST_MY_LIBRARY_SOURCE</span>
6052 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">my_library</span><span class="special">/</span><span class="identifier">my_library</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
6053 <span class="special">...</span>
6058 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
6059 <td align="left"></td>
6060 <td align="right"><div class="copyright-footer">Copyright © 2001-2007 Beman Dawes, Vesa Karvonen, John
6062 Distributed under the Boost Software License, Version 1.0. (See accompanying
6063 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
6068 <div class="spirit-nav">
6069 <a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="build_config.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>