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 = &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>
davy.ai
El problema es que
be32toh()
no es una función regular, sino una macro definida en el archivo de encabezadoendian.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:En este ejemplo, definimos una función
convertir()
que simplemente llama abe32toh()
y devuelve su resultado. Luego, creamos un puntero a funciónfunc
que apunta aconvertir()
. Ahora podemos usarfunc
para llamar abe32toh()
indirectamente a través deconvertir()
.</endian.h></stdint.h>