Come gestisco la macro massima in windows.h in collisione con max in std?

Quindi stavo cercando di ottenere un input intero valido da cin e ho usato una risposta a questa domanda .

Si consiglia:

#include  // includes WinDef.h which defines min() max() #include  using std::cin; using std::cout; void Foo() { int delay = 0; do { if(cin.fail()) { cin.clear(); cin.ignore(std::numeric_limits::max(), '\n'); } cout <> delay) || delay == 0); } 

Il che mi dà un errore su Windows, dicendo che la macro max non accetta molti argomenti. Il che significa che devo farlo

 do { if(cin.fail()) { cin.clear(); #undef max cin.ignore(std::numeric_limits::max(), '\n'); } cout <> delay) || delay == 0); 

Per farlo funzionare. È piuttosto brutto; c’è un modo migliore per aggirare questo problema? Forse dovrei memorizzare la definizione di max e ridefinirla in seguito?

Definisci la macro NOMINMAX :

Ciò sopprimerà le definizioni min e max in Windef.h.

Basta racchiudere il nome della funzione tra parentesi:

 (std::numeric_limits::max)() 

In questo caso non è necessaria la macro NOMINMAX, inoltre non riceverai gli avvisi del compilatore

Stai solo cercando di svuotare il cin-buffer? Ho sempre usato solo:

 cin.ignore(cin.rdbuf()->in_avail()); 

Se non si sa se qualcun altro potrebbe aver incluso windows.h senza NOMINMAX , è ansible definire una macro fittizia che può essere utilizzata per sopprimere le invocazioni di macro simili a funzioni senza modificare la definizione:

 #define DUMMY ... std::numeric_limits::max DUMMY () 

Non proprio carino, ma funziona ed è non intrusivo.

Quando lavoro con il file di intestazione di Windows, preferisco nasconderlo il più ansible includendolo solo in codice specializzato e file di intestazione (usando pimpl se necessario), perché getta troppa spazzatura nello spazio dei nomi globale.

Se ti capita di utilizzare GDI +, l’approccio con NOMINMAX non funzionerà per te, perché le intestazioni di GDI + richiedono min o max nello spazio dei nomi globale.

E la soluzione più semplice in questo caso è di indefinire min / max quando non sono più necessari.

Il codice di esempio per illustrare l’approccio:

 //#define NOMINMAX - this won't work #include  #include  #undef max #undef min ... #include