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?
On 7/02/2017 00:48, Vinnie Falco wrote:
On Mon, Feb 6, 2017 at 6:39 AM, Bjorn Reese <breese@mail1.stofanet.dk> wrote:
Is this guideline still relevant?
I believe so, at least for Microsoft Visual C++ if you have not defined "NOMINMAX".
If the *application author* has not defined NOMINMAX. Libraries don't get a choice in the matter, except for their own compiled source.
-----Original Message----- From: Boost [mailto:boost-bounces@lists.boost.org] On Behalf Of Bjorn Reese Sent: 06 February 2017 11:40 To: boost@lists.boost.org 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
On Tue, Feb 7, 2017 at 11:27 AM, Paul A. Bristow <pbristow@hetp.u-net.com> wrote:
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?)
The tools are fine, its just that the docs didn't specifically address the case where min and max are called with explicit template arguments, e.g.: std::min<std::size_t>(x, y); However, as Andrey pointed out:
min and max are function-like macros. The code above is not affected by those.
That answers my question. It might be worth adding a sentence describing this case to http://www.boost.org/development/requirements.html to clarify. Regards
participants (4)
-
Bjorn Reese
-
Gavin Lambert
-
Paul A. Bristow
-
Vinnie Falco