c++ - sirve - ¿Cómo trato con la macro máxima en windows.h colisionando con max en std?
string c++ (5)
¿Estás tratando de limpiar el buffer cin? Siempre acabo de usar:
cin.ignore(cin.rdbuf()->in_avail());
Así que estaba tratando de obtener una entrada entera válida de cin, y usé una respuesta a esta question .
Recomendó:
#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);
}
Lo que me da un error en Windows, diciendo que la macro max
no toma tantos argumentos. Lo que significa que tengo que hacer esto
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);
Para que funcione Eso es bastante feo; ¿Hay una mejor manera de solucionar este problema? ¿Tal vez debería almacenar la definición de max
y redefinirlo después?
Definir la macro NOMINMAX
:
Esto suprimirá las definiciones mínimas y máximas en Windef.h.
Si no sabe si alguien más pudo haber incluido windows.h
sin NOMINMAX
, podría definir una macro ficticia que se puede usar para suprimir invocaciones de macro similares a funciones sin cambiar la definición:
#define DUMMY
...
std::numeric_limits<std::streamsize>::max DUMMY ()
No es realmente bonito tampoco, pero funciona y no es intrusivo.
Cuando trabajo con el archivo de encabezado de Windows, prefiero ocultarlo tanto como puedo al incluirlo solo en código especializado y archivos de encabezado (usando pimpl si es necesario), porque arroja demasiada basura al espacio de nombres global.
Si usa GDI +, el enfoque con NOMINMAX
no funcionará para usted, porque los encabezados de GDI + requieren un min
o max
en el espacio de nombres global.
Y la solución más simple en este caso es definir min
/ max
cuando ya no son necesarios.
El ejemplo de código para ilustrar el enfoque:
//#define NOMINMAX - this won''t work
#include <Windows.h>
#include <gdiplus.h>
#undef max
#undef min
...
#include <cxxopts.hpp>
Simplemente ajuste el nombre de la función entre paréntesis:
(std::numeric_limits<size_type>::max)()
No es necesario utilizar la macro NOMINMAX en este caso, además de que no recibirá las advertencias del compilador