2011-03-30 24 views
10

¿Cuál es la forma correcta de convertir/emitir un int a un size_t en C99 en plataformas de 32 bits y 64 bits de Linux?C: fundido int a size_t

Ejemplo:

int hash(void * key) { 
    //... 
} 

int main (int argc, char * argv[]) { 
    size_t size = 10; 
    void * items[size]; 
    //... 
    void * key = ...; 
    // Is this the right way to convert the returned int from the hash function 
    // to a size_t? 
    size_t key_index = (size_t)hash(key) % size; 
    void * item = items[key_index]; 
} 
+0

no veo razón por la que no funcionaría. – slartibartfast

+0

¿Cuál es el problema con un molde común ordinario '(size_t)'? ¿De alguna manera no es "apropiado"? – AnT

+0

Sí, eso es correcto, aunque creo que está convertido implícitamente por lo que no * realmente * necesita el '(size_t)'. –

Respuesta

15

Todos los tipos aritméticos se convierten implícitamente en C. Es muy raro que necesite un molde, generalmente solo cuando desea convertir hacia abajo, reduciendo el módulo 1 más el valor máximo del tipo más pequeño, o cuando necesita forzar la aritmética en modo sin firmar para usar las propiedades de la aritmética sin signo.

Personalmente, me gusta el ver arroja porque:

  1. Son desorden visual feo, y
  2. Sugieren a mí que la persona que escribió el código estaba recibiendo advertencias acerca de los tipos, y la arrojó en moldes cerrar el compilador sin entender el motivo de las advertencias.

Por supuesto, si se habilita unos niveles de advertencia de ultra-exigente, sus conversiones implícitas podrían causar un montón de advertencias incluso cuando están correctos ...

5
size_t key_index = (size_t)hash(key) % size; 

está bien. En realidad, ni siquiera necesita el modelo:

size_t key_index = hash(key) % size; 

hace lo mismo.

3

Aparte de la cuestión de fundición (que no lo hace necesita como se dijo anteriormente), hay algunas cosas más intrincadas que pueden salir mal con el código.

si se supone que hash() devuelve un índice a una matriz, también debe devolver un size_t. Como no es así, puede obtener efectos extraños cuando key_index es mayor que INT_MAX.

diría que size, hash(), key_index todos deben ser del mismo tipo, probablemente size_t para estar seguro, por ejemplo:

size_t hash(void * key) { 
    //... 
} 

int main (int argc, char * argv[]) { 
    size_t size = 10; 
    void * items[size]; 
    //... 
    void * key = ...; 

    size_t key_index = hash(key) % size; 
    void * item = items[key_index]; 
} 
+0

No puedo encontrar nada en el estándar C99 que restrinja los índices de matriz a menos de 'INT_MAX'. Si obtienes efectos raros, es un error del compilador. Obviamente en el ejemplo dado '10 JeremyP