Aus bestimmten Gründen kann ich die erste Antwort nicht kommentieren...
Einige von euch haben Makros mit lokalen Variablen gezeigt, aber niemand hat erwähnt, dass man nicht einfach irgendeinen Namen in einem Makro verwenden kann! Das wird den Benutzer eines Tages beißen! Und warum? Weil die Eingabeargumente in der Makrovorlage ersetzt werden. Und in Ihren Makrobeispielen haben Sie den wahrscheinlich am häufigsten verwendeten Variablennamen verwendet i .
Zum Beispiel, wenn das folgende Makro
#define FOO(X) do { int i; for (i = 0; i < (X); ++i) do_something(i); } while (0)
wird in der folgenden Funktion verwendet
void some_func(void) {
int i;
for (i = 0; i < 10; ++i)
FOO(i);
}
wird das Makro nicht die vorgesehene Variable i verwenden, die am Anfang von some_func deklariert ist, sondern die lokale Variable, die in der do ... while-Schleife des Makros deklariert ist.
Verwenden Sie daher niemals allgemeine Variablennamen in einem Makro!
3 Stimmen
Für das Beispiel mit dem else würde ich einen Ausdruck von
void
am Ende eingeben... wie ((void)0) .3 Stimmen
Zur Erinnerung: Die
do while
Konstrukt ist nicht kompatibel mit Return-Anweisungen, so dass dieif (1) { ... } else ((void)0)
Konstrukt hat mehr kompatible Verwendungen in Standard C. Und in GNU C werden Sie das in meiner Antwort beschriebene Konstrukt bevorzugen.