0 Tage Serie
c / intermediate
Snippet

Sichere mehrteilige Makros mit do-while(0)

Das Einschließen von mehrzeiligen Makros in einen 'do { ... } while(0)'-Block stellt sicher, dass sie sich wie eine einzelne Anweisung verhalten, was Logikfehler verhindert, wenn sie in 'if'- oder 'else'-Blöcken ohne Klammern verwendet werden.

snippet.c
c
1
2
3
4
5
6
7
#define SWAP(a, b) do { \
int temp = a; \
a = b; \
b = temp; \
} while (0)
if (condition) SWAP(x, y);
Erklärung
1
do { ... } while (0)
Erzeugt eine Schleife mit einmaliger Ausführung, die die Verwendung eines Semikolons am Aufrufort erzwingt.
2
int temp = a;
Definiert einen lokalen Gültigkeitsbereich für die temporäre Variable, um Namenskollisionen zu vermeiden.