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
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.