capypad
0 Tage Serie
c / expert
Snippet

X-Makros für synchronisierte Definitionen

Das X-Makro-Muster ist eine leistungsstarke Präprozessor-Technik, um mehrere zusammengehörige Listen (wie Enums, Strings oder Switch-Cases) synchron zu halten. Man definiert eine Liste einmal und 'wendet' sie an, indem das 'X'-Makro vor jeder Verwendung neu definiert wird. Dies verhindert Fehler, bei denen ein Enum aktualisiert, aber das zugehörige String-Array vergessen wird.

snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define STATUS_LIST \
X(IDLE, "System is waiting") \
X(BUSY, "Processing task") \
X(ERROR, "Fault detected")
 
// Generate Enum
typedef enum {
#define X(a, b) STATUS_##a,
STATUS_LIST
#undef X
} status_t;
 
// Generate String Table
const char* status_msg[] = {
#define X(a, b) b,
STATUS_LIST
#undef X
};
Erklärung
1
#define STATUS_LIST \
Definiert die Masterliste der Elemente und deren zugehörige Metadaten.
2
X(IDLE, "System is waiting")
Ein Eintrag in der Liste; X ist ein Platzhalter für ein zukünftiges Makro.
3
#define X(a, b) STATUS_##a,
Definiert X neu, um das erste Argument zu extrahieren und an ein Präfix für das Enum anzuhängen.
4
STATUS_LIST
Expandiert die Masterliste unter Verwendung der aktuellen Definition von X.