0 Tage Serie
c / expert
Snippet

Generische Callbacks via Funktionszeiger

Funktionszeiger ermöglichen Polymorphie in C. Durch die Verwendung von 'void*'-Parametern in einer Callback-Signatur können generische Algorithmen (wie qsort) erstellt werden, die auf jedem Datentyp operieren. Der Callback abstrahiert die Logik (z. B. den Vergleich), während der Algorithmus den Ausführungsfluss steuert.

snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
typedef int (*compare_fn)(const void*, const void*);
int compare_ints(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
void sort_and_print(int *arr, size_t n, compare_fn cmp) {
qsort(arr, n, sizeof(int), cmp);
for(size_t i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\n");
}
int main() {
int data[] = {42, 7, 101, -5};
sort_and_print(data, 4, compare_ints);
return 0;
}
Erklärung
1
typedef int (*compare_fn)(const void*, const void*);
Definiert einen Typ für eine Funktion, die zwei generische Zeiger entgegennimmt und eine Ganzzahl zurückgibt.
2
(*(int*)a - *(int*)b)
Wandelt die generischen void-Zeiger für den Vergleich zurück in den spezifischen Typ um.