Hallo,
callbacks werden ja gerne verwendet, um Abhängigkeiten von SW-Teilen zu
reduzieren. Jetzt ärgere ich mich gerade mit einer C-Library herum, die
es zwar erlaubt, einen callback zu installieren, aber auch genau nur
einen.
Jetzt frage ich mich gerade ob es ggf. ein übliches Pattern sein könnte,
beim Installieren nicht nur den Funktionszeiger mit zugeben, sondern
auch den Speicher, der benötigt wird, um eine verkettete Liste mit
callbacks auf zu bauen?
Beispiel:
1 | // library.h
|
2 | typedef void (*callback_t)( int update );
|
3 |
|
4 | struct callback_node
|
5 | {
|
6 | callback_t callback;
|
7 | struct callback_node* next;
|
8 | };
|
9 |
|
10 | void install_callback( struct callback_node* );
|
11 |
|
12 | void update( int value );
|
13 |
|
14 | // library.h
|
15 | static struct callback_node* nodes = 0;
|
16 |
|
17 | void install_callback( struct callback_node* node )
|
18 | {
|
19 | node->next = nodes;
|
20 | nodes = node;
|
21 | }
|
22 |
|
23 | void update( int value )
|
24 | {
|
25 | for ( struct callback_node* n = nodes; n; n = n->next )
|
26 | n->callback( value );
|
27 | }
|
28 |
|
29 | // main.c
|
30 | void showupdates( int update )
|
31 | {
|
32 |
|
33 | }
|
34 |
|
35 | struct callback_node showupdates_node = { showupdates };
|
36 |
|
37 | int main()
|
38 | {
|
39 | install_callback( &showupdates_node );
|
40 | }
|
das würde erlauben, mehrere Callbacks zu installieren, ohne dynamischen
Speicher zu verwenden oder mit fest dimensionierten Array zu arbeiten.
Der overhead ist mit einem pointer auch recht überschaubar. Zusätzlich
könnte man in callback_node auch noch einen void-pointer als User
argument unterbringen.
Ist das ein übliches Pattern in C, das evtl. sogar einen Namen hat?
mfg Torsten