问题
So I was trying to get valid integer input from cin, and used an answer to this question.
It recommended:
#include <Windows.h> // includes WinDef.h which defines min() max()
#include <iostream>
using std::cin;
using std::cout;
void Foo()
{
int delay = 0;
do
{
if(cin.fail())
{
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
cout << "Enter number of seconds between submissions: ";
} while(!(cin >> delay) || delay == 0);
}
Which gives me an error on Windows, saying that the max
macro doesn't take that many arguments. Which means I have to do this
do
{
if(cin.fail())
{
cin.clear();
#undef max
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
cout << "Enter number of seconds between submissions: ";
} while(!(cin >> delay) || delay == 0);
To get it to work. That's pretty ugly; is there a better way to work around this issue? Maybe I should be storing the definition of max
and redefining it afterward?
回答1:
Define the macro NOMINMAX:
This will suppress the min and max definitions in Windef.h.
回答2:
Just wrap the function name in parenthesis:
(std::numeric_limits<size_type>::max)()
No need for the NOMINMAX macro in this case, plus you won't get compiler warnings
回答3:
Are you just trying to flush the cin buffer? I always just used:
cin.ignore(cin.rdbuf()->in_avail());
回答4:
If you don't know whether somebody else might have included windows.h
without NOMINMAX
, you might define a dummy macro which can be used to suppress function-like macro invocations without changing the definition:
#define DUMMY
...
std::numeric_limits<std::streamsize>::max DUMMY ()
Not really pretty either, but works and is non-intrusive.
When working with the Windows header file, I prefer to hide it as much as I can by including it only in specialized code and header files (using pimpl if necessary), because it throws just too much garbage into the global namespace.
回答5:
If you happen to use GDI+, the approach with NOMINMAX
won't work for you, because headers of GDI+ require min
or max
in global namespace.
And the simplest workaround in this case is to undefine min
/max
when they are no longer needed.
The code sample to illustrate the approach:
//#define NOMINMAX - this won't work
#include <Windows.h>
#include <gdiplus.h>
#undef max
#undef min
...
#include <cxxopts.hpp>
来源:https://stackoverflow.com/questions/11544073/how-do-i-deal-with-the-max-macro-in-windows-h-colliding-with-max-in-std