PRB: Using STL in Windows Program Can Cause Min/Max Conflicts

Article translations Article translations
Article ID: 143208 - View products that this article applies to.
This article was previously published under Q143208
Expand all | Collapse all

SYMPTOMS

A windows-based program that uses the Standard Template Library (STL) will not compile, and it generates several invalid parameter and syntax errors.

CAUSE

The problem is caused by conflicting definitions of min and max. Min and max are defined as macros in Windef.h as follows:
   #ifndef NOMINMAX
   #ifndef max
   #define max(a,b)  (((a) > (b)) ? (a) : (b))
   #endif

   #ifndef min
   #define min(a,b)  (((a) < (b)) ? (a) : (b))
   #endif
   #endif  /* NOMINMAX */ 
				
NOTE: Windef.h is included by Windows.h, which is included in nearly every Windows-based program.

Min and max are defined as templated functions in the Standard Template Library (STL). The following definitions of min and max can be found in the file Algobase.h:
   template <class T>
   inline const T& min(const T& a, const T& b) {
       return b < a ? b : a;
   }
   template <class T, class Compare>
   inline const T& min(const T& a, const T& b, Compare comp) {
       return comp(b, a) ? b : a;
   }
   template <class T>
   inline const T& max(const T& a, const T& b) {
       return  a < b ? b : a;
   }
   template <class T, class Compare>
   inline const T& max(const T& a, const T& b, Compare comp) {
       return comp(a, b) ? b : a;
   }
				
Because the Windef.h definition is a macro, the function definitions cause syntax errors when both Windef.h (or Windows.h) and Algobase.h (from the STL) are included. The precise errors will depend on the order in which the two are compiled.

RESOLUTION

Simply define the NOMINMAX preprocessor symbol. This can be done in the Developer Studio project under Build, Settings, on the C/C++ tab, in the Preprocessor category. This will suppress the min and max definitions in Windef.h.

STATUS

This behavior is by design.

Properties

Article ID: 143208 - Last Review: August 3, 2001 - Revision: 1.0
APPLIES TO
  • Microsoft Visual C++ 4.0 Standard Edition
Keywords: 
kb3rdparty kbprb KB143208
Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.

Give Feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com