2008-08-18 3 views

risposta

17

Verificare se il codice è compreso il windows.h file di intestazione e sia il vostro codice o altre intestazioni di terze parti hanno un proprio min()/max() definizioni. Se sì, allora anteporre il tuo windows.h inclusione con una definizione di NOMINMAX come questo:

#define NOMINMAX 
#include <windows.h> 
1

Ugh ... ambito, amico: std::min(), std::max().

+5

È ancora necessario #definire NOMINMAX o il preprocessore espanderà ancora min e max. – Ferruccio

0

non l'ho usato in anni, ma dalla spinta di memoria assegna min e max troppo, forse?

2

Un'altra possibilità potrebbe essere da effetti collaterali. La maggior parte delle macro min/max includerà i parametri più volte e potrebbe non fare ciò che ci si aspetta. Si potrebbero anche generare errori e avvertimenti.

 
max(a,i++) expands as ((a) > (i++) ? (a) : (i++))

afterwards i is either plus 1 or plus 2

L'() per l'espansione sono per evitare problemi se lo si chiama con formule. Prova ad espandere max (a, b + c)

0

Onestamente, quando si tratta di min/max, trovo meglio definire solo la mia:

#define min(a,b) ((a) < (b) ? (a) : (b)) 
#define max(a,b) ((a) >= (b) ? (a) : (b)) 
+4

Che, francamente, sta chiedendo problemi. In C++, usa 'using std :: swap' e scrivi il tuo scambio quando puoi fare meglio del default. In C, per lo locazione scrivere 'min #define (a, b) ((a) <(b) (a): (b))' e assicuratevi di non chiamare con qualsiasi cosa con effetti collaterali, perché avrai una valutazione multipla. –

2

Dal momento che Windows definisce questo come uno stile di funzione macro, la seguente soluzione è disponibile:

int i = std::min<int>(3,5); 

Questo funziona perché la macro min() si espande solo quando min è seguita da (, e non quando è seguito da <.