Wie erstelle ich ein mehrzeiliges Präprozessor-Makro? Ich weiß, wie man eine Zeile macht:
#define sqr(X) (X*X)
aber ich brauche so etwas:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
Wie kann ich das zum Laufen bringen?
Dies ist nur ein Beispiel, das echte Makro kann sehr lang sein.
c++
c
c-preprocessor
laute Katze
quelle
quelle
Antworten:
Sie verwenden
\
als Zeilenfortsetzungs-Escapezeichen.#define swap(a, b) { \ (a) ^= (b); \ (b) ^= (a); \ (a) ^= (b); \ }
BEARBEITEN: Wie @abelenky in den Kommentaren hervorhob, muss das
\
Zeichen das letzte Zeichen in der Zeile sein . Ist dies nicht der Fall (auch wenn es sich danach nur um Leerzeichen handelt), werden in jeder Zeile danach verwirrende Fehlermeldungen angezeigt.quelle
` after all useful lines of the macro, and add a comment afterward saying something like
// nach dem Makro. It's sometimes easier to ensure that all lines of a macro end with
`eine leere Zeile zu platzieren, als sicherzustellen, dass alle bis auf die letzte Zeile dies tun.Sie können festlegen, dass ein Makro mehrere Zeilen umfasst, indem Sie
\
am Ende jeder Zeile einen Backslash ( ) einfügen :#define F(x) (x) \ * \ (x)
quelle
BITTE BEACHTEN SIE, wie Kerrek SB und Coaddict betonten, worauf in der akzeptierten Antwort hingewiesen werden sollte, setzen Sie IMMER geschweifte Klammern um Ihre Argumente. Das sqr-Beispiel ist das einfache Beispiel, das in CompSci-Kursen vermittelt wird.
Hier ist das Problem: Wenn Sie es so definieren, wie Sie es getan haben, was passiert, wenn Sie "sqr (1 + 5)" sagen? Sie erhalten "1 + 5 * 1 + 5" oder 11
Wenn Sie die Klammern richtig platzieren, erhalten
#define sqr(x) ((x)*(x))
Sie ((1 + 5) * (1 + 5)) oder was wir wollten 36 ... schön.
Ed S. wird das gleiche Problem mit 'Swap' haben
quelle
sqr(++i)
? (Angenommen, wir haben eineint i
) :)i
wird es erhöht, wenn es in das Makro eingesetzt wird (in diesem Fall wird es zweimal ersetzt), dann wird es multipliziert. Alsosqr(++5) == ((7) * (7))
sqr(++i)
to((++i)*(++i))
würde undefiniertes Verhalten hervorrufen, weil der Wert voni
innerhalb dieser Anweisung mehr als einmal geändert wird (kein Sequenzpunkt zwischen den Operationen).Sie müssen die neue Zeile am Ende der Zeile umgehen, indem Sie sie mit einem
\
:#define sqr(X) \ ((X)*(X))
quelle