Geri çağırma işlevleri (callbacks), adreslerinin diğer bir işlevin argümanı olarak gönderildiği işlevlerdir. Bu, olay işleyicilerini, kullanıcı algoritmalarını ve eklentileri gerçekleştirmeyi sağlar.
Callback işlevinin tanımı:
typedef void (*callback_func_t)(int);
void process(callback_func_t cb) { // ... cb(42); // geri çağırmayı çağır } void handler(int n) { printf("İşlenmiş sayı: %d ", n); } int main() { process(handler); return 0; }
İpuçları:
Geri çağırma olarak imza uyuşmazlığı olan bir işlev gönderilebilir mi?
Yanlış yaygın cevap: "Evet, C buna izin verir, eğer tür dönüşümü açıkça tanımlanırsa".
Doğru cevap: Ancak, resmi tür dönüşümü mümkün olsa da, böyle bir işlevin çağrılması belirsiz davranışa yol açar — parametreler yanlış değerlerle gönderilebilir, yığın bozulabilir.
Tehlike örneği:
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); } // TEHLİKE: imzalar farklı
Hikaye
Hikaye
Hikaye
Bir çapraz platform sistemi geliştirirken, yazar geri çağırma işlevleri için yanlış çağrı konvansiyonunu tanımlamıştı. Bu, bir işletim sisteminde görünmezdi, ancak başka birinde C kütüphanesinden geri çağırmalar yapıldığında programın çökmesine yol açıyordu.