webentwicklung-frage-antwort-db.com.de

Multi-Line-Präprozessor-Makros

Wie erstelle ich ein Multi-Line-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.

62
noisy cat

Sie nutzen \ als Zeilenfortsetzungs-Escapezeichen.

#define swap(a, b) {               \
                       (a) ^= (b); \
                       (b) ^= (a); \
                       (a) ^= (b); \
                   }

BEARBEITEN: Wie @abelenky in den Kommentaren darauf hingewiesen, die \ Zeichen muss das letzte Zeichen in der Zeile sein. Wenn dies nicht der Fall ist (auch wenn es sich anschließend nur um Leerzeichen handelt), werden in jeder Zeile verwirrende Fehlermeldungen angezeigt.

100
Ed S.

Sie können ein Makro mehrzeilig machen, indem Sie einen Backslash (\) am Ende jeder Zeile:

#define F(x) (x)   \
              *    \
             (x)
15
Kerrek SB

BITTE BEACHTEN SIE wie Kerrek SB und coaddict betonten, worauf in der akzeptierten Antwort hingewiesen werden sollte, IMMER Platzieren Sie 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 Klammern richtig herum setzen, #define sqr(x) ((x)*(x))
Sie bekommen ((1 + 5) * (1 + 5)) oder was wir wollten 36 ... schön.

Ed S. wird das gleiche Problem mit "Swap" haben

13
jiveturkey

Sie müssen die neue Zeile am Ende der Zeile mit einem \:

#define sqr(X) \
        ((X)*(X))
3
codaddict