2010-09-30 18 views
7

Hoy hice una versión de 64 bits de mi proyecto por primera vez. Básicamente se compiló, enlazó y ejecutó correctamente, excepto por las advertencias que se quejaban de la incompatibilidad entre el nuevo tipo 64 bit size_t y el tipo int simple. Esto ocurre sobre todo en situaciones como esta en mi código:¿Cómo evitar problemas con los tipos size_t e int en compilaciones de 64 bits en C++?

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

Esto es bastante fácil de solucionar, y leí un artículo que decía que uno debe utilizar en lugar size_t o ptrdif_t como índices de bucle. Pero, ¿qué puedo hacer en una situación como esta?

void outsideLibraryFunc(int n); 

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

que no puedo cambiar declaración de la función de la biblioteca fuera, que espera un argumento de tipo int, y tengo que pasar el número de los elementos del vector. ¿Qué puedo hacer aparte de deshabilitar las advertencias del compilador?

+0

+1 en Q: no sabía que size_t! = Unsigned int – pm100

+0

@ pm100 It * can * be, y en la mayoría de los sistemas de 32 bits sí lo es, pero no tiene que ser así. En particular, en sistemas de 64 bits que utilizan las convenciones LP64 o LLP64 (la mayoría de los sistemas modernos de 64 bits), tiende a ser más grande que un 'unsigned int'. –

+0

ssize_t a veces está disponible para un tamaño firmado_t – user318904

Respuesta

9

Realice un lanzamiento explícito a int, p.

void outsideLibraryFunc(int n); 

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

no elimina ninguno de los problemas potenciales con la conversión de size_t a int, pero sí indicar al compilador que está haciendo la conversión a propósito, y que no le avisará de ello.

+0

+1, la mayor ventaja es que al leer el código se ve el molde que de otro modo estaría implícito, y con el conocimiento que el compilador no puede tener, puede validar si tiene sentido o no. Como en el ejemplo: aunque el compilador no puede garantizar que el valor devuelto por una función que sea de tipo 'size_t' encajará en un entero de 32 bits, puede verificar manualmente si tiene sentido o no. –

3

¿Echelo? En serio, si no puede cambiar la biblioteca externa, no hay mucho que pueda hacer. Para ser un control adicional seguro para el desbordamiento.

+0

+1 para la verificación de desbordamiento (aunque rara vez tiene más de 2 billones de objetos) –

+0

¿Cómo verifico si hay desbordamiento? Recuerdo un poco de desbordamiento en EFLAGS, pero ¿cómo puedo acceder a él de forma C? – neuviemeporte

+1

@neuviemeporte: if (vec.size()> INT_MAX) {/ * error * /} else {/ * (int) cast funcionará * /}. Pero como dijo Viktor, el cheque podría ser excesivo ... –

Cuestiones relacionadas