Forum: Compiler & IDEs Frage zum C-Präprozessor


von Dirk B. (devnull)


Lesenswert?

Hallo zusammen,

mit folgenden Makros fülle ich eine Struktur mit den
Initialisierungswerten:
1
#if MENU_DEPTH == 0
2
#define MENU_INITIAL_STACK_DATA {}
3
#elif MENU_DEPTH == 1
4
#define MENU_INITIAL_STACK_DATA {0}
5
#elif MENU_DEPTH == 2
6
#define MENU_INITIAL_STACK_DATA {0,0}
7
#elif MENU_DEPTH == 3
8
#define MENU_INITIAL_STACK_DATA {0,0,0}
9
#elif MENU_DEPTH == 4
10
#define MENU_INITIAL_STACK_DATA {0,0,0,0}
11
#elif MENU_DEPTH == 5
12
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0}
13
#elif MENU_DEPTH == 6
14
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0,0}
15
#elif MENU_DEPTH == 7
16
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0,0,0}
17
#elif MENU_DEPTH == 8
18
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0,0,0,0}
19
#elif MENU_DEPTH == 9
20
#define MENU_INITIAL_STACK_DATA {0,0,0,0,0,0,0,0,0}
21
#endif

Hat jemand eine Idee, wie man so etwas skalierbar und
weniger redundant hin bekommt?

Klar, ich könnte ein Script nehmen, das mir eine Liste
generiert und die als Header einbinden. Aber das wäre
eher zweite Wahl.

Aber ja, ne, schon klar: Es geht eigendlich nur um
schöneren Code, sonst nix :-)

Ich freue mich auf Eure Antworten.

Schönen Gruß, Dirk

von Karl H. (kbuchegg)


Lesenswert?

Wie und wo benutzt du MENU_INITIAL_STACK_DATA?

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

MEMSET(3) 
Bibliotheksfunktionen 
MEMSET(3)



BEZEICHNUNG
       memset - fülle Speicher mit einer Bytekonstante

ÜBERSICHT
       #include <string.h>

       void *memset(void *s, int c, size_t n);

BESCHREIBUNG
       Die Funktion memset() schreibt n mal die Bytekonstante c in den 
Speicherbereich, auf den s zeigt.

RÜCKGABEWERT
       Die Routine memset() gibt einen Zeiger auf den Speicherbereich 
zurück, auf den s zeigt.

KONFORM ZU
       SVID 3, BSD 4.3, ISO 9899

SIEHE AUCH
       bzero(3), swab(3).




GNU                                                     14. Juni 1996 
MEMSET(3)

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


Lesenswert?

1
#define MENU_INITIAL_STACK_DATA {0}

Das genügt.  Der Fall, dass ein Array 0 Elemente hat, ist ohnehin
syntaktisch nicht OK.  Alle anderen Fälle werden davon abgedeckt.

Das ganze braucht man natürlich nur für eine automatische Variable.
Hat die Variable `static storage' (also explizit 'static' deklariert
oder global), dann wird sie ohnehin by default mit 0 initialisiert.

von Ex_RundS (Gast)


Lesenswert?

Ich habe bei meinen Präprozessorkonfigurierbaren Arrays sows gemacht
1
uint8_t mein_arry [ELEMENT_ANZ] =
2
{
3
   0
4
#ifdef KANAL_2_AKTIV
5
 , 1
6
#endif
7
};

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


Lesenswert?

Die hässliche Schreibweise mit dem Komma vorn muss man übrigens
nicht benutzen.  Die fällt ja sowieso auf die Nase, wenn alle
möglichen Initialisierungselemente innerhalb von #if/#ifdef
stehen.  Der C-Standard gestattet prinzipiell ein Komma am Ende
einer Liste von Initialisierern, auch wenn danach kein weiteres
Element mehr folgt.  Damit geht sowas:
1
config_t config[] = {
2
#if CONFIG_THIS
3
  { 0, 1, 4 },
4
#endif
5
#if CONFIG_THAT
6
  { 1, 42, 0 },
7
#endif
8
};

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Der C-Standard gestattet prinzipiell ein Komma am Ende
> einer Liste von Initialisierern, auch wenn danach kein
> weiteres Element mehr folgt.

Unterscheidet sich das bei Enums? Da sind mir Compiler aufgefallen, die 
das nicht mögen. Alter Standard?

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


Lesenswert?

Rufus t. Firefly schrieb:
>> Der C-Standard gestattet prinzipiell ein Komma am Ende
>> einer Liste von Initialisierern, auch wenn danach kein
>> weiteres Element mehr folgt.

> Unterscheidet sich das bei Enums?

Nein, ist dort genauso gestattet.

> Da sind mir Compiler aufgefallen, die
> das nicht mögen. Alter Standard?

Ja, vermutlich.  Mir ist so, als wäre das erst durch C99
abgesegnet.  Ich müsste mir allerdings extra einen ANSI-89/ISO-90-
Standard ansehen, um das mal zu vergleichen.

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.