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
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 Enumtypedef enum {#define X(a, b) STATUS_##a,STATUS_LIST#undef X} status_t;// Generate String Tableconst 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.