ProgramaciónDesarrollador C embebido

Describe cómo se implementan y funcionan las funciones de callback en el lenguaje C. ¿Cómo se deben declarar y utilizar estas funciones al desarrollar bibliotecas o interactuar con APIs?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

Las funciones de callback son funciones cuyo адрес se pasa como argumento a otra función. Esto permite implementar manejadores de eventos, algoritmos personalizados y complementos.

Declaración de una función de callback:

  1. Se describe el tipo de puntero correspondiente:
typedef void (*callback_func_t)(int);
  1. Paso de la función manejadora:
void process(callback_func_t cb) { // ... cb(42); // llamada a callback } void handler(int n) { printf("Número procesado: %d ", n); } int main() { process(handler); return 0; }

Consejos:

  • Adhiérase a un typedef explícito para los tipos de punteros, el código será más legible.
  • Asegúrese de que la firma de la función de callback coincida con la esperada.
  • Evite pasar funciones locales no inicializadas o liberadas.

Pregunta trampa

¿Se puede pasar una función con una firma no coincidente como callback?

Respuesta errónea común: «Sí, C lo permitirá si se declara un casting explícito».

Respuesta correcta: Aunque el casting formal es posible, la llamada a tal función resultará en comportamiento indefinido, ya que se pueden pasar valores incorrectos a los parámetros, dañando la pila.

Ejemplo de peligro:

typedef void (*cb_t)(int); void wrong_cb(double d) { printf("%f ", d); } void call(cb_t f) { f(123); } int main() { call((cb_t)wrong_cb); } // PELIGROSO: las firmas difieren

Ejemplos de errores reales debido al desconocimiento de los matices del tema


Historia

En un proyecto embebido, la función de ordenamiento recibía como función de comparación un puntero a una función con una firma demasiado restrictiva. Esto llevó a errores de ordenamiento y corrupción de memoria debido a la incorrecta transmisión de parámetros.

Historia

En una biblioteca de motor gráfico, se implementó un mecanismo de eventos basado en callbacks, pero parte de los callbacks referenciaban accidentalmente funciones locales de bibliotecas dinámicas ya liberadas, causando caídas al encontrarse con direcciones no válidas.

Historia

Al desarrollar un sistema multiplataforma, el autor definió incorrectamente la convención de llamada para las funciones de callback. Esto no se manifestaba en un sistema operativo, pero causaba que el programa fallara en otro al llamar a callbacks desde una biblioteca C.