Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2003-12-30 11:36:49

John Maddock wrote:

>>It seems extremely unwise to be undef'ing min and max. Evil though they
>>are, many Win32 platform headers (and users' headers!) depend on them,
>>and there is simply no way to write a template or set of overloads that
>>behave exactly as the macros do.
> I agree - but there is plenty of boost code that relies on std::min and
> std::max *not* being macros - were we not to do this then a fair portion of
> Boost would just stop working :-(

There are known ways of dealing with this problem. Putting parens around
the min and max identifiers prevents the macro invocation. For instance,

     std::max( a, b ); ==> (std::max)( a, b );


     struct foo { struct foo {
         int max(); ==> int (max)();
     }; };

It also turns off ADL, but I'd be surprised if any code in boost relies
on ADL with min/max.

> There is BTW a trivial fix for your problem: include the windows headers
> *before* any Boost ones.

This is not a trivial fix. I'm working on a project with ~30
sub-projects and over 5000 source files, with dozens of other
programmers making constant changes. Ensuring that no boost header gets
included before a windows/ATL/MFC header is a nightmare.

> However, there is also a bug in our workaround - we haven't include
> <algorithm> to get the template min/max functions as well as the additional
> overloads that we add in the workaround, and it's this that is the cause of
> the error in this case, I'm committing a revised win32.hpp which will now
> compile the sample you posted (or will be as soon as the config regression
> tests complete).

I described above how boost can be changed to accomodate the min/max
macros. Is there a reason why this approach is not used? Is there a
known issue with some compilers?

Eric Niebler
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at