Devo utilizzare l'implementazione C o C ++ per restituire una dimensione massima di un tipo di variabile?
Domanda
Dal punto di vista standard, devo utilizzare la seguente dal C ++ intestazione <limits>
?
UCHAR_MAX
, che è l'implementazione C o
std::numeric_limits<unsigned char>::max()
che è l'implementazione C ++.
Il risultato è equivalente tra le due versioni, ma devo scegliere un'implementazione basata su alcuni standard o la leggibilità e la portabilità in questo caso. Nota questa implementazione deve essere cross-platform. Sto scrivendo il codice C ++.
Soluzione
Se si desidera che il codice sia in grado di compilare come C, quindi è praticamente bisogno di usare <limits.h>
. Se si scrive C ++, probabilmente è meglio usare l'intestazione C ++ <limits>
invece. Quest'ultimo permette di scrivere codice che funziona nei modelli che non possono davvero essere duplicati con l'intestazione C:
template <class T>
class mytemplate {
T x;
void somefunc() { x = std::numeric_limits<T>::max(); } // or whatever...
};
Altri suggerimenti
Sapere in che lingua si sta scrivendo, e scrivere in quella lingua. Se si scrive C ++, utilizzare il modo di fare le cose standard C ++.
standard C ++ è normalmente cross-platform (ci sono eccezioni, come export
, ma è export
rimosse dalla standard C ++ comunque). Di solito è più leggibile da attaccare con C ++ costrutti che per passare da costrutti C e C ++.
Si dovrebbe usare
sulla piattaforma Windows, se si include
#define NOMINMAX
per evitare un conflitto di nomi con min e max.
Quando si utilizza C, std::numeric_limits
, ovviamente, non è disponibile.
In C ++ dipende da cosa si vuole fare -. std::numeric_limits<T>::max()
non è un'espressione costante con l'attuale standard C ++
In questi casi, un'alternativa alle macro C-ish potrebbe essere quella di usare qualcosa come Boost.Integers interi tratti const_min
/ const_max
che funziona anche in contesti templated.