2010-09-30 14 views
7

Oggi ho realizzato per la prima volta una build a 64 bit del mio progetto. Fondamentalmente è stato compilato, collegato ed eseguito ok, tranne che per gli avvertimenti che si lamentavano dell'incompatibilità tra il nuovo tipo size_t a 64 bit e il tipo int semplice. Questo si verifica soprattutto in situazioni come questa nel mio codice:Come evitare problemi con i tipi size_t e int in build C++ a 64 bit?

void func(std::vector<Something> &vec) 
{ 
    int n = vec.size(); 
    for (int i=0; i < n; i++) 
    { 
     ....vec[i].... 
    } 
} 

questo è abbastanza facile da risolvere, e ho letto un articolo dicendo si dovrebbe piuttosto usare size_t o ptrdif_t come indici di loop. Ma cosa posso fare in una situazione come questa?

void outsideLibraryFunc(int n); 

void func(std::vector<Something> &vec) 
{ 
    int n = vec.size(); 
    outsideLibraryFunc(n); 
} 

non può cambiare dichiarazione di funzione della biblioteca all'esterno, che si aspetta un argomento di tipo int, e devo passare il numero degli elementi del vettore. Cosa posso fare se non disabilitare gli avvisi del compilatore?

+0

+1 su Q: non sapevo che size_t! = Unsigned int – pm100

+0

@ pm100 It * can * be, e sulla maggior parte dei sistemi a 32 bit lo è, ma non deve essere. In particolare, nei sistemi a 64 bit che utilizzano le convenzioni LP64 o LLP64 (la maggior parte dei moderni sistemi a 64 bit), tende ad essere più grande di un 'unsigned int'. –

+0

ssize_t a volte è disponibile per un size_t firmato – user318904

risposta

9

Fare un cast esplicito su int, ad es.

void outsideLibraryFunc(int n); 

void func(std::vector<Something> &vec) 
{ 
    outsideLibraryFunc(static_cast<int>(vec.size())); 
} 

non elimina nessuno dei potenziali problemi con la conversione size_t a int, ma lo fa dire al compilatore che si sta facendo la conversione di proposito, e non avvisa su di esso.

+0

+1, il vantaggio maggiore è che durante la lettura del codice si vede il cast che altrimenti sarebbe implicito, e con la consapevolezza che il compilatore non può avere è possibile verificare se ha senso o meno. Come nell'esempio: mentre il compilatore non può garantire che il valore restituito da una funzione di tipo 'size_t' si adatti a un intero a 32 bit, è possibile verificare manualmente se ha senso o meno. –

3

Castarlo? Seriamente se non puoi cambiare la libreria esterna, non c'è molto che tu possa fare. Per un controllo extra sicuro per l'overflow.

+0

+1 per il controllo di overflow (anche se raramente si hanno più di 2 miliardi di oggetti) –

+0

Come si verifica un overflow? Ricordo un bit di overflow in EFLAGS, ma come posso accedervi in ​​un modo C? – neuviemeporte

+1

@neuviemeporte: if (vec.size()> INT_MAX) {/ * error * /} else {/ * (int) cast funzionerà * /}. Ma come ha detto Viktor, il controllo potrebbe essere eccessivo ... –

Problemi correlati