2012-07-18 10 views
31

Tak więc próbowałem uzyskać poprawne dane wejściowe z liczby całkowitej i użyłem odpowiedzi na tę question.Jak radzić sobie z makrem maks. W Windows.h, kolidując z maks. W standardzie?

Zaleca:

#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); 
} 

co daje mi błąd w systemie Windows, mówiąc, że max makro nie bierze, że wiele argumentów. Aby to zrobić, zadzwoń. To dość brzydkie; Czy istnieje lepszy sposób obejścia tego problemu? Może powinienem przechowywać definicję max i redefiniować ją później?

+3

Czy dołączyć ? Czemu? Jeśli naprawdę tego potrzebujesz, możesz uniknąć zdefiniowania _min_ i _max_ makr, definiując ** NOMINMAX ** przed jego włączeniem. –

+1

Czy używasz "namespace std"? Jeśli tak, celowo łączysz przestrzenie nazw. –

+4

@PaulBeckingham: makra nie mają przestrzeni nazw, a zatem włączając windows.h bez żadnych zabezpieczeń zawsze będą kolidować z 'std :: min' /' std :: max' – PlasmaHH

Odpowiedz

64

Definicja makro NOMINMAX:

ten blokuje minimalną i maksymalną definicji w Windef.h.

8

Po prostu próbujesz opróżnić bufor cyn? I zawsze tylko używane:

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

Jest to dobra odpowiedź, chociaż zaakceptowałem drugą, ponieważ bezpośrednio odpowiada na pytanie, podczas gdy twój adresuje źródło problemu w inny sposób. :) – Almo

6

Jeśli nie wiem, czy ktoś inny może mieć włączone windows.h bez NOMINMAX można zdefiniować obojętne makro, które mogą być używane do tłumienia funkcji podobny wywołania makr bez zmiany definicji:

#define DUMMY 
... 
std::numeric_limits<std::streamsize>::max DUMMY() 

naprawdę nie całkiem albo, ale działa i jest nieinwazyjne.

Podczas pracy z plikiem nagłówkowym Windows wolę schować go tyle, ile mogę, włączając go tylko w wyspecjalizowanych kodowych i nagłówków plików (używając pimpl jeśli trzeba), ponieważ rzuca po prostu zbyt dużo śmieci do globalnej przestrzeni nazw .

+2

Interesujące. Z pewnością będę postępować zgodnie z radą, aby usunąć peeling z systemu windows.h, jeśli to możliwe. – Almo

32

Wystarczy owinąć nazwę funkcji w nawiasach:

(std::numeric_limits<size_type>::max)() 

Nie potrzeba makra NOMINMAX w tym przypadku także nie dostaniesz ostrzeżenia kompilatora

+0

'std :: max (a, b)' działa dla mnie i jest bardziej czytelny. Parametr szablonu blokuje makro. Czy czegoś brakuje? –

+0

@DaleWilson Tak, czegoś brakuje. Twoje połączenie otrzyma większą z dwóch wartości. std :: numeric_limits :: max() zwróci maksymalną wartość, którą można zapisać przez size_type. – Ben

+1

Zawijanie nazwy funkcji w parens przyjmuje wskaźnik funkcji i wywołuje ją tak, jakby implementował wzorzec strategii za pomocą wskaźników funkcji. Jest to sprzeczne z opinią [wyrażającą pomysły bezpośrednio w kodzie] (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#p1-express-ideas-directly-incode), ponieważ ta druga składnia jest raczej próba obejścia definicji makr min i max (nie implementacja wzorca strategii za pomocą wskaźnika funkcji). Infrastruktura Clang/LLVM sugeruje "' #define NOMINMAX' przed dowolnym nagłówkiem Windows ". Które jest lepsze porady IMO. –

1

Jeśli zdarzy ci się używać GDI +, podejście z NOMINMAX nie będzie działać, ponieważ nagłówki GDI + wymagają min lub max w globalnej przestrzeni nazw.

Najprostszym rozwiązaniem w tym przypadku jest niezdefiniowanie min/max, gdy nie są już potrzebne.

Próbka kod do zilustrowania podejście:

//#define NOMINMAX - this won't work 
#include <Windows.h> 
#include <gdiplus.h> 
#undef max 
#undef min 
... 
#include <cxxopts.hpp> 
+0

Potencjalnie odwraca problem: jeśli zderzenie nazwy dzieje się w nagłówku, rozwiązane zgodnie z opisem tutaj, a ty dodajesz ten nagłówek gdzieś wymagający zdefiniowania min/max - pecha ... – Aconcagua

Powiązane problemy