Puedo conseguir un compilador de «advertencia: el retorno de los descartes clasificados de puntero de tipo de destino» desde mi función siguiente.

unsigned char* getBeginning(const unsigned char * Packet)
{
                    return Packet+3;
}

He investigado este y otros lugares, y parece que el compilador se queja de que a pesar de que tomar en un puntero const, yo estoy devolviendo un puntero no const.

Lo que estoy tratando de lograr es:

1) yo quiero que los usuarios sepan que no voy a cambiar a cualquiera de sus datos en esta función, de ahí la const.

2) sin Embargo, más tarde, las funciones se utilice el puntero devuelto aquí para hacer cambios, por lo que no quiero hacer de mi regreso de tipo const así.

Existe una mejor manera de hacer esto cuando no me sale un aviso? Todavía estoy aprendiendo C.

  • Está usted seguro de que usted necesita para eliminar la const? Eso suena como una mala idea…
  • Eso es un común lenguaje C para este caso (la alternativa sería escribir dos funciones (una para const, uno para los no-const), o para escribir sólo una no-const versión y dejar que la persona que llama elenco de la const de distancia), cf. strchr.
  • Gracias por la respuesta! Después de la lectura de las respuestas es posible que me estoy haciendo esta completamente equivocado. Yo tenía la intención de que el usuario pase de mí un unsigned char *. No tiene que ser un const unsigned char *. Pensé que podría utilizar el «const» en la definición de la función de demostrar que yo no sería la modificación de los datos señalada EN ESTA función en PARTICULAR. Así que, en otras palabras, no estoy esperando que el usuario pase de mí una const unsigned char *, yo sólo quería demostrarles que yo no voy a tocar el unsigned char * aquí. Más tarde, el puntero devuelto no modificar los datos. Hay una manera mejor de hacer esto?
InformationsquelleAutor user1762250 | 2014-07-18

2 Comentarios

  1. 11

    C no tiene una conversión implícita de const calificados tipos de puntero a los no-const-calificados, por lo que se debe añadir un explícito, es decir, de un reparto. Luego de la advertencia desaparece:

    unsigned char* getBeginning(const unsigned char * Packet)
    {
                        return (unsigned char *)Packet+3;
    }

    Sólo ten en cuenta que esta función es entonces ligeramente «peligroso», ya que puede ocultar la caída de la const calificación. Pero esto no es más peligroso que cosas como strchr en la biblioteca estándar que hacer lo mismo. El comportamiento es perfectamente bien definido como el tiempo que se abstengan de intentar modificar un const objeto completo a través del puntero devuelto.

    • Si yo te entiendo, a modificar el retorno de strchr resultados en un comportamiento indefinido, derecho?
    • No realmente, de ello depende el puntero pasa a ella, si es fue un const char, a continuación, modificar sería arriesgado… pero no esperes que el paso de una cadena literal constante que devuelve un nuevo puntero a una modificables matriz de char (no malloc + memcpy sucede), pero si pasa un regular char* a ella, los lugares de memoria de la estancia en el mismo, si apuntaba a un char[99] es seguro para modificar los 99 bytes
    • bonita explicación, gracias
  2. 1

    Packet se declara como const unsigned char *. Sin una conversión explícita al agregar 3 está implícitamente declarando que el resultado sea el mismo tipo.

    Para corregir el error se debe convertir explícitamente el tipo de valor devuelto:

    return (unsigned char *) Packet + 3;

Dejar respuesta

Please enter your comment!
Please enter your name here