Frage zum C-Präprozessor

OP #1379114
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
(Firma: O.D.I.S.) #1379152
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)
Moderator Persönliche Seite #1379192
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.
Gast #1379198
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
};
Moderator Persönliche Seite #1379205
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
};
Moderator Persönliche Seite #1379225
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.