mikrocontroller.net

Forum: Compiler & IDEs Makos bei Mehrzeilendefinition ineinander verschalten


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Turf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Per Build-Option möchte ich eine Struktur unterschiedlich initialisieren 
und diese ineinander verschachteln.
Dummycode:
#define INIT_VALUE    {a, b}, \
                      {c, d}, \
#if SUPPORT
                      {e, f}, \
#endif /* SUPPORT */
#if OPTION
                      {g, h}, \
#if USE_ALSO
                      {i, j}, \

#endif /* USE_ALSO */ 
#endif  /* OPTION */
                      {k, l}
                      /* INIT_VALUE END  */


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

Autor: Bauform B. (bauformb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu dient der Umweg über INIT_VALUE? Das kann man doch sowieso nur 
einmal verwenden? Geht es nicht einfach so:
struct MyStruct data= {
   {a, b},
   {c, d},
#if SUPPORT
   {e, f},
#endif /* SUPPORT */
#if OPTION
   {g, h},
#if USE_ALSO
   {i, j},
#endif /* USE_ALSO */ 
#endif  /* OPTION */
   {k, l}
};

Autor: Peter D. (peda)
Datum:

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

Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#if SUPPORT
#  define SUPPORT_INIT {e, f},
#else
#  define SUPPORT_INIT
#endif

#if OPTION
#  if USE_ALSO
#    define OPTION_INIT {g, h}, {i, j},
#  else
#    define OPTION_INIT {g, h}
#  endif
#else
#  define OPTION_INIT
#endif

struct MyStruct data = {
  {a, b},
  {c, d},
  SUPPORT_INIT
  OPTION_INIT
  {k, l}
}
...aber schön ist das auch nicht, dafür aber schon fehleranfällig :-S

Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#if geht innerhalb von #define gar nicht. Du brauchst zwei #define.
#if SUPPORT
#define INIT_VALUE    {a, b}, \
                      {c, d}, \
                      {e, f}
#else /* SUPPORT */
#define INIT_VALUE    {a, b}, \
                      {c, d}
#endif /* SUPPORT */

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.