Hi Leute,
ich würde gerne die folgenden Codezeilen über ein #define Makro
vereinfachen:
1 | // Typendefinitionen
|
2 | typedef struct {
|
3 | int x;
|
4 | int y;
|
5 | } widgetData_t;
|
6 |
|
7 | typedef void (*pWidget_t)(void*);
|
8 | typedef struct
|
9 | {
|
10 | pWidget_t pWidget;
|
11 | void *data;
|
12 | } widget_t;
|
13 |
|
14 |
|
15 | // Widgets erstellen
|
16 | // Widget1 "test" (das hier soll optimiert werden)
|
17 | widgetData_t testData = { 1, 2 };
|
18 | widget_t test = { containerWidget, &testData };
|
19 |
|
20 | // Widget2 "test2" (das hier soll optimiert werden)
|
21 | widgetData_t test2Data = { 4, 4 };
|
22 | widget_t test2 = { containerWidget, &test2Data };
|
23 |
|
24 | // Dieser Array wird später einer Funktion übergeben, die die Widgets abarbeitet (das hier soll auch optimiert werden)
|
25 | widget_t* test_widgets[] = {
|
26 | &test,
|
27 | &test2,
|
28 | NULL
|
29 | };
|
Bin jetzt erstmal hingegangen und habe 2 Makros geschrieben:
1 | #define CREATE_WIDGET(name,type,param1,param2) \
|
2 | widgetData_t name##Data = { param1, param2 }; \
|
3 | widget_t name = { type, &name##Data };
|
4 | #define FILL_WIDGET_LIST(name) &name
|
5 |
|
6 | // Erstellen der Widgets sieht jetzt so aus:
|
7 | CREATE_WIDGET(test, containerWidget, 1, 2);
|
8 | CREATE_WIDGET(test2, containerWidget, 4, 4);
|
9 |
|
10 | widget_t* test_widgets[] = {
|
11 | FILL_WIDGET_LIST(test),
|
12 | FILL_WIDGET_LIST(test2),
|
13 | NULL
|
14 | };
|
Der Code ist jetzt schon übersichtlicher geworden, allerdings muss ich
pro widget immer noch 2 Zeilen schreiben, einmal CREATE_WIDGET(..:) und
einmal FILL_WIDGET_LIST(..).
Hat jemand eine Idee wie man das noch weiter vereinfachen könnte?
Optimal wäre es, wenn ich nur ein Makro aufrufen muss.