Forum: Compiler & IDEs Brauche Hilfe beim Vereinfachen mittels Makros


von peterguy (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich denke, ohne dynamischen Speicher wirst du da kein Glück haben, da
du nicht innerhalb einer Initialisierung noch weitere Definitionen
von Variablen vornehmen kannst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.