switch sirve que para c++ iostream cin

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