es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Defina un puntero de función para la función be32toh().

Acabo de aprender sobre punteros a funciones aquí, pero no pude definir un puntero a función para be32toh() u otras funciones del encabezado endian.h.

En primer lugar, puedo hacer lo que se dice en el hilo dado:


#include <endian.h> int addInt(int n, int m) { return n+m; } int main(){ int (*functionPtr)(int,int); functionPtr = addInt; return 0; }

Pero cuando trato de hacer lo mismo para una función como be32toh(), obtendré un error de compilación:


#include <stdint.h> #include <endian.h> int addInt(int n, int m) { return n+m; } int main(){ int (*functionPtr)(int,int); functionPtr = addInt; uint32_t (*newptr)(uint32_t); newptr = &be32toh; return 0; }

Compilar como:

$ gcc test.c

El resultado es el siguiente:

test.c: En la función ‘main’:
test.c:15:15: error: ‘be32toh’ undeclared (first use in this function)
   15 |     newptr = &amp;be32toh;
      |               ^~~~~~~
test.c:15:15: note: each undeclared identifier is reported only once for each function it appears in

¿Cuál es el problema y cómo solucionarlo?</endian.h></stdint.h></endian.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema es que be32toh() no es una función regular, sino una macro definida en el archivo de encabezado endian.h. Los punteros a funciones solo se pueden definir para funciones regulares.

    Para solucionarlo, se puede crear una función envolvente para be32toh() y usar un puntero a función para apuntar a la función envolvente. Aquí hay un ejemplo:

    #include <stdint.h>
    #include <endian.h>
    
    uint32_t convertir(uint32_t valor) {
        return be32toh(valor);
    }
    
    int main() {
        uint32_t (*func)(uint32_t);
        func = &convertir;
        return 0;
    }
    

    En este ejemplo, definimos una función convertir() que simplemente llama a be32toh() y devuelve su resultado. Luego, creamos un puntero a función func que apunta a convertir(). Ahora podemos usar func para llamar a be32toh() indirectamente a través de convertir().</endian.h></stdint.h>

Comments are closed.