Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

#define NOMINMAX using std::min/max

i recently added:

#define NOMINMAX
#include <Windows.h>
#include <algorithm>

to my main.cpp in order to use

std::max( x , x ); // x is just a placeholder and not actual anything
std::min( x  , x );

but i can't use std::max()/std::min() in other files.

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'

i tried to add #define NOMINMAX in my other files, but fails. what is the clue?

i looked around before asking, but i don't understand the answer Possible problems with NOMINMAX on Visual C++

like image 423
NaturalDemon Avatar asked Nov 16 '12 12:11

NaturalDemon


5 Answers

If you're really desperate, put parentheses around the function names:

(std::min)(x, y);

This syntax won't apply a function-like macro. (Formally, to apply a function-like macro the name of the macro must be followed by optional white space then a '('.)

like image 186
Pete Becker Avatar answered Nov 02 '22 00:11

Pete Becker


Define NOMINMAX via a compiler flag:

> cl.exe -DNOMINMAX ...

this will then be defined for all of the source files. I don't use the IDEs but this page provides guidance on navigating the IDE to set this: Using STL in Windows Program Can Cause Min/Max Conflicts :

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.

like image 26
hmjd Avatar answered Nov 02 '22 00:11

hmjd


If you define NOMINMAX, because you prefer the STL version, then you may get problems while including gdiplus.h, which uses the min/max macro. As solution you need to include the STL headers and use "using namespace std" before you include the gdiplus.h.

In example:

#define NOMINMAX

// Include C++ headers
#include <algorithm>
using namespace std;

// Include Windows headers
#include <windows.h>
#include <gdiplus.h>
like image 44
David Gausmann Avatar answered Nov 02 '22 00:11

David Gausmann


It's likely that your problem is that you #define NOMINMAX after you #include "windows.h". It is important that the #define come first.

The reason is that windows.h (actually I think windef.h, which is included by windows.h) has code similar to this:

#ifndef NOMINMAX
#define min(x,y) ((x) < (y) ? (x) : (y))
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif

So #define NOMINMAX is telling the compiler (or actually the preprocessor) to skip over the definitions of min and max, but it will only apply if you do it before you #include "windows.h".

like image 7
Tom Avatar answered Nov 02 '22 01:11

Tom


In Visual Studio, Adding 'NOMINMAX' to C++ preprocessor properties fixed my issue.

Open project properties -> C/C++ -> Preprocessor -> Preprocessor Definitions -> Add 'NOMINMAX'.

like image 3
KRG Avatar answered Nov 02 '22 00:11

KRG