2016-09-30 5 views
0

Ist es richtig, mehrere Anweisungen in einem Makro zu schreiben?Mehrere Anweisungen in einem Makro

#define AB() do { printf("hi"); } while(0) 
+1

Ein Makro ist nur Textersatz. Ich denke nicht, dass die Frage einen Sinn ergibt. Sie haben im Allgemeinen nichts * in * einem Makro, weil ein Makro keine syntaktische Einheit ist. –

+0

Nun, das hängt davon ab, wie Sie das Makro verwenden möchten –

+0

Das betreffende Makro hat den Vorteil, dass die Verwendung als Funktionsaufruf geschrieben werden kann, d. H. 'AB();' –

Antwort

0

Ja, das ist der richtige Weg.

Im Idealfall möchten Sie ein Makro in eine einzelne Aussage zu erweitern, nicht eine Verbindung Aussage. Dein befriedigt das.

Sie können dieses Makro sicher in einem if, else Block verwenden.

1

Ja.

Obwohl der richtige Weg meistens ist, überhaupt kein funktionsähnliches Makro zu haben.

Bitte beachten Sie, dass das do-while (0) Trick in Codebasen mit schlampig Klammer Stil nur relevant ist, wie

if(x) 
    AB(); 
else 

Das do-while (0) Trick wird verursacht durch die Compiler-Fehler verhindern streak Semikolon, wenn es eine else Anweisung folgt. Wenn das Makro nur geschweifte Klammern verwendet, erhalten Sie if(){}; else, was ein Syntaxfehler ist.

Beachten Sie, dass der oben genannte Klammerstil einen der teuersten Softwarefehler in der Geschichte verursacht hat, bekannt als Apple "goto-fail" Bug. Es gibt also sehr gute Gründe, es nie zu benutzen. Wenn Sie nach jeder Anweisung immer {} verwenden, wird der do-while (0) Trick ebenfalls irrelevant.