Forum: Compiler & IDEs Makos bei Mehrzeilendefinition ineinander verschalten


von Turf (Gast)


Lesenswert?

Hallo!

Per Build-Option möchte ich eine Struktur unterschiedlich initialisieren 
und diese ineinander verschachteln.
Dummycode:
1
#define INIT_VALUE    {a, b}, \
2
                      {c, d}, \
3
#if SUPPORT
4
                      {e, f}, \
5
#endif /* SUPPORT */
6
#if OPTION
7
                      {g, h}, \
8
#if USE_ALSO
9
                      {i, j}, \
10
11
#endif /* USE_ALSO */ 
12
#endif  /* OPTION */
13
                      {k, l}
14
                      /* INIT_VALUE END  */
15
16
17
struct MyStruct data= { INIT_VALUE };

Aber das Verschachteln funktioniert aufgrund der Definition über mehrere 
Zeilen nicht.
Die Frage ist, wie bekommt man das schön gelöst?
Große #if Optionen aufbauen, indem INIT_VALUE vollständig definiert ist, 
ist doof und erhöht den Pflegeaufwand, wenn ich z.B. Standardmäßig (zu 
Beginn) eine weitere Einstellung unterstützen möchte.

Sowas hier finde ich grauenhaft!
[c]
#if OPTION
#if SUPPORT
#if USE_ALSO
...
#endif /* USE_ALSO */
#else /* SUPPORT */
#if USE_ALSO
...
#endif /* USE_ALSO */
#endif /* SUPPORT */
#else /* OPTION */
....
#endif /* OPTION */

Danke für eure Hilfe.

Grüße
Turf

von Bauform B. (bauformb)


Lesenswert?

Wozu dient der Umweg über INIT_VALUE? Das kann man doch sowieso nur 
einmal verwenden? Geht es nicht einfach so:
1
struct MyStruct data= {
2
   {a, b},
3
   {c, d},
4
#if SUPPORT
5
   {e, f},
6
#endif /* SUPPORT */
7
#if OPTION
8
   {g, h},
9
#if USE_ALSO
10
   {i, j},
11
#endif /* USE_ALSO */ 
12
#endif  /* OPTION */
13
   {k, l}
14
};

von Peter D. (peda)


Lesenswert?

Ein # muß immer am Zeilenanfang stehen, ist also in Macros nicht 
erlaubt.

von Eric B. (beric)


Lesenswert?

1
#if SUPPORT
2
#  define SUPPORT_INIT {e, f},
3
#else
4
#  define SUPPORT_INIT
5
#endif
6
7
#if OPTION
8
#  if USE_ALSO
9
#    define OPTION_INIT {g, h}, {i, j},
10
#  else
11
#    define OPTION_INIT {g, h}
12
#  endif
13
#else
14
#  define OPTION_INIT
15
#endif
16
17
struct MyStruct data = {
18
  {a, b},
19
  {c, d},
20
  SUPPORT_INIT
21
  OPTION_INIT
22
  {k, l}
23
}
...aber schön ist das auch nicht, dafür aber schon fehleranfällig :-S

von fop (Gast)


Lesenswert?

#if geht innerhalb von #define gar nicht. Du brauchst zwei #define.
1
#if SUPPORT
2
#define INIT_VALUE    {a, b}, \
3
                      {c, d}, \
4
                      {e, f}
5
#else /* SUPPORT */
6
#define INIT_VALUE    {a, b}, \
7
                      {c, d}
8
#endif /* SUPPORT */

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.