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
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.