Mögliche Duplikate:
Warum gibt es in C / C ++ - Makros manchmal sinnlose Anweisungen in / while und if / else?
tue {...} while (0) what ist es gut für?
Ich arbeite an einem C-Code, gefüllt mit Makros wie folgt:
%Vor% Kann jemand erklären, was dieses Makro macht und warum do {} while(0)
benötigt wird? Würde das nicht einfach einmal ausgeführt?
macht genau dasselbe wie stuff (). Also, was ist dann die große Sache? Das Problem besteht in der Syntax von Makros. Angenommen, wir haben das Makro wie folgt definiert:
%Vor%Dann gibt es zwei Probleme. Die erste ist relativ unbedeutend: Für die Verwendung von SAFE_FREE ist kein abschließendes Semikolon mehr erforderlich. Wichtiger jedoch, Code wie:
%Vor%Wird erweitert zu:
%Vor% Das Definieren des Makros wie oben verhindert seltsames Verhalten wie oben, da do { ... } while(0)
genau wie eine Anweisung ohne Semikolon funktioniert.
Die do while-Methode ist eine gängige Konvention, bei der das Makro einen abschließenden Semikolon wie eine Standard-c-Funktion erfordert. Abgesehen davon stellt es nur sicher, dass die Variable, die freigegeben wurde, auf NULL gesetzt ist, so dass zukünftige Aufrufe zum Freigeben keine Fehler verursachen.
BTW Häufig gestellte Fragen zu C ++ - Stil und -Technik Bjarne Stroustrup schlägt vor, einen Inline-Code zu verwenden (Vorlage) Funktion, um eine "löschen und null"
zu tun %Vor%Die Idee hinter do / while (0) ist, dass Sie das Makro verwenden können, in dem Sie einen Funktionsaufruf ohne unerwartete Fehler verwenden würden.
Wenn Sie beispielsweise folgenden Code hatten:
%Vor%und das Makro war nur:
%Vor%Sie würden ein ganz anderes Ergebnis erhalten. Die Do / Why-Konvention vermeidet diese Fehler, indem sie sich konsistent verhält.