¿Por qué es posible pasar un void(*)(int x, int y) a attachInterrupt, que espera un void(*)()?
He sido descuidado y por alguna razón creé una función que toma dos argumentos, y lo pasé a attachInterrupt
así:
int state = 42;
void simplified_state_handler(){
state++;
}
void interrupt_func(int x, int y) {
simplified_state_handler();
}
attachInterrupt(digitalPinToInterrupt(10), interrupt_func, CHANGE);
El código fue compilado sin quejas en absoluto, e incluso funciona. Ahora, un poco más tarde, realmente no puedo entender por qué. Leer y analizar el código de attachInterrupt
no ayudó. Por favor, explique por qué puedo pasar una función así. Mantengo la función simplified_state_handler
(ahora inútil) en el ejemplo, tal vez sea importante.
davy.ai
La función
attachInterrupt
acepta como tercer argumento el nombre de una función, que es un puntero a la función. Cuando pasasinterrupt_func
como el puntero a la función, el compilador automáticamente lo ajusta para que se adapte a la firma de función requerida, que esvoid (*)()
(una función que no recibe argumentos y no devuelve nada).interrupt_func
recibe dos argumentos, pero la funciónattachInterrupt
no se preocupa por ellos. Simplemente llama al puntero a la función proporcionado cada vez que ocurre la interrupción.Por lo tanto,
interrupt_func
recibe dos argumentos que son simplemente ignorados. Ni siquiera los utiliza, simplemente llama a tu funciónsimplified_state_handler
, que a su vez incrementa la variablestate
.En resumen, puedes pasar una función de este tipo a
attachInterrupt
porque el compilador la ajusta a la firma de función correcta, y la función de interrupción simplemente ignora los argumentos que se le pasan.