|
Boost : |
Subject: Re: [boost] Requirements: min and max macros
From: Paul A. Bristow (pbristow_at_[hidden])
Date: 2017-02-07 16:27:51
> -----Original Message-----
> From: Boost [mailto:boost-bounces_at_[hidden]] On Behalf Of Bjorn Reese
> Sent: 06 February 2017 11:40
> To: boost_at_[hidden]
> Subject: Re: [boost] Requirements: min and max macros
>
> On 02/05/2017 06:15 PM, Vinnie Falco wrote:
> > From
> > http://www.boost.org/development/requirements.html#Naming
> >
> > "Make sure your code compiles in the presence of the min() and max()
> > macros. Some platform headers define min() and max()macros which cause
> > some common C++ constructs to fail to compile. Some simple tricks can
> > protect your code from inappropriate macro substitution:..."
>
> Is this guideline still relevant?
Yes - if only because the Boost checking tool
http://www.boost.org/doc/libs/1_63_0/tools/inspect/index.html
will complain if it is missing.
http://www.boost.org/development/requirements.html tells you what to do - search down for max or min.
"
Make sure your code compiles in the presence of the min() and max() macros. Some platform headers define min() and max() macros
which cause some common C++ constructs to fail to compile. Some simple tricks can protect your code from inappropriate macro
substitution:
If you want to call std::min() or std::max():
If you do not require argument-dependent look-up, use (std::min)(a,b).
If you do require argument-dependent look-up, you should:
#include <boost/config.hpp>
Use BOOST_USING_STD_MIN(); to bring std::min() into the current scope.
Use min BOOST_PREVENT_MACRO_SUBSTITUTION (a,b); to make an argument-dependent call to min(a,b).
If you want to call std::numeric_limits<int>::max(), use (std::numeric_limits<int>::max)() instead.
If you want to call a min() or max() member function, instead to doing obj.min(), use (obj.min)().
If you want to declare or define a function or a member function named min or max, then you must use the
BOOST_PREVENT_MACRO_SUBSTITUTION macro. Instead of writing int min() { return 0; } you should write int min
BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; } This is true regardless if the function is a free (namespace scope) function, a
member function or a static member function, and it applies for the function declaration as well as for the function definition.
"
And anyway, it is a Good Thing because it will cause trouble to the many Microsoft users.
Paul
PS That this question was asked suggests that our tools for finding the right documentation are still lacking (or does this not
answer the original poster's question?)
--- Paul A. Bristow Prizet Farmhouse Kendal UK LA8 8AB +44 (0) 1539 561830
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk