2012-05-02 20 views
44

Jak zrobić makro procesora wielowierszowego? Wiem, jak zrobić jedną linię:Makra preprocesora dla wielu linii

#define sqr(X) (X*X) 

ale muszę coś takiego:

#define someMacro(X) 
    class X : public otherClass 
    { 
     int foo; 
     void doFoo(); 
    }; 

Jak mogę uzyskać to do pracy?

To tylko przykład, prawdziwe makro może być bardzo długie.

+0

Możesz łatwo uzyskać odpowiedź, przeszukując SO. na przykład http://stackoverflow.com/questions/4007865/few-questions- about-c-preprocessor – CppLearner

+0

różne metody są tutaj: http://www.parashift.com/c++-faq/macros-with-multi-stmts .html – Ayrat

+0

Powiązane: http://stackoverflow.com/questions/98944/how-to-generate-a-newline-in-a-cpp-macro –

Odpowiedz

79

Używasz \ jako znaku ucieczki linii.

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

EDIT: Jak @abelenky wskazano w uwag \ charakter musi być ostatnim znakiem wiersza. Jeśli tak nie jest (nawet jeśli jest to po prostu biała spacja), w kolejnych wierszach pojawią się mylące komunikaty o błędach.

+27

Słowo ostrzeżenia: Upewnij się, że \ jest ** ostatnim * * postać na linii. W C białe znaki zwykle nie mają znaczenia, ale w tym przypadku niewidoczne białe znaki na końcu linii mogą cię zabić. – abelenky

+0

@abelenky: Dobrze, dzięki. –

+2

Należy dodać, że tekst wynikowy znajduje się w jednym wierszu. Ponieważ C traktuje całą białą przestrzeń między tokenami to samo zwykle nie ma większego znaczenia, ale nadal. –

11

Można zrobić makro zajmującą wiele wierszy poprzez umieszczenie backslash (\) na końcu każdej linii:

#define F(x) (x) \ 
       * \ 
      (x) 
+5

+1: za nie pominięcie nawiasów wokół 'x'! -) – alk

2

musisz uciec z nowej linii na końcu linii uciekając go z \:

#define sqr(X) \ 
     ((X)*(X)) 
10

UWAGA jak Kerrek SB i coaddict wskazał, które powinny były zostać podkreślone w przyjętym odpowiedź ZAWSZE umieść nawiasy klamrowe wokół argumentów. Przykład sqr jest prostym przykładem nauczanym na kursach CompSci.
Oto problem: jeśli zdefiniujesz go tak, jak zrobiłeś, gdy mówisz "sqr (1 + 5)"? Otrzymasz "1 + 5 * 1 + 5" lub 11
Jeśli poprawnie umieścisz nawiasy klamrowe wokół niego, #define sqr(x) ((x)*(x))
otrzymasz ((1 + 5) * (1 + 5)) lub co chcieliśmy 36 ... piękny.
Ed S. będzie miał ten sam problem z "zamień"

+0

co z' sqr (++ i) '? (załóżmy, że mamy 'int i') :) –

+0

Zrobiłem to jako ćwiczenie i najwyraźniej" i "jest inkrementowane, ponieważ jest podstawiane do makra (w tym przypadku jest podstawione dwa razy), to jest mnożone.Więc 'sqr (++ 5) == ((7) * (7))' – jiveturkey

+1

@ GézaTörök Rozszerzenie 'sqr (++ i)' na '((++ i) * (++ i))' wywołałoby niezdefiniowane zachowanie, ponieważ wartość 'i' jest modyfikowana więcej niż jeden raz w tej instrukcji (brak punktu sekwencji między operacjami). – moooeeeep

Powiązane problemy