Sólo estoy empezando a envolver mi cabeza alrededor de los punteros de función en C. Para entender cómo la fundición de los punteros de función funciona, me escribió el siguiente programa. Básicamente, crea un puntero a una función que toma un parámetro, lo envía a un puntero de función con tres parámetros y llama a la función, proporcionando tres parámetros. Tenía curiosidad por lo que sucedería:¿Qué pasa si yo echo un puntero de función, cambiando el número de parámetros
#include <stdio.h>
int square(int val){
return val*val;
}
void printit(void* ptr){
int (*fptr)(int,int,int) = (int (*)(int,int,int)) (ptr);
printf("Call function with parameters 2,4,8.\n");
printf("Result: %d\n", fptr(2,4,8));
}
int main(void)
{
printit(square);
return 0;
}
Esto compila y se ejecuta sin errores o advertencias (gcc -Wall en Linux/x86). La salida es en mi sistema:
Call function with parameters 2,4,8.
Result: 4
Así que al parecer los argumentos superfluos se descartan simplemente en silencio.
Ahora me gustaría entender lo que realmente está pasando aquí.
- En cuanto a la legalidad: si entiendo correctamente la respuesta a Casting a function pointer to another type, esto es simplemente un comportamiento indefinido. Entonces, el hecho de que esto funcione y produzca un resultado razonable es solo pura suerte, ¿correcto? (O la amabilidad por parte de los autores de compiladores)
- ¿Por qué no GCC avisarme de esto, incluso con Wall? ¿Es esto algo que el compilador simplemente no puede detectar? ¿Por qué?
Vengo de Java, donde la verificación de tipografía es mucho más estricta, por lo que este comportamiento me confundió un poco. Tal vez estoy experimentando un choque cultural :-).
Si eso ya es un shock cultural para usted, espere hasta que descubra que en C++ los punteros a las funciones miembro pueden ser mayores que void *, aunque no llevan este puntero con ellos ... – OregonGhost