sto vedendo strani errori quando il mio codice C++ ha min() o max() chiama. Sto usando i compilatori di Visual C++.Strano C++ errori con il codice che ha min()/max() chiama
risposta
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>
Ugh ... ambito, amico: std::min()
, std::max()
.
È ancora necessario #definire NOMINMAX o il preprocessore espanderà ancora min e max. – Ferruccio
non l'ho usato in anni, ma dalla spinta di memoria assegna min e max troppo, forse?
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++))L'() per l'espansione sono per evitare problemi se lo si chiama con formule. Prova ad espandere max (a, b + c)afterwards i is either plus 1 or plus 2
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))
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. –
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 <
.
Questa è ufficialmente la domanda più strana su Stack Overflow – eplawless