Jak zrobić makro preprocesora wieloliniowego? Wiem, jak zrobić jedną linię:
#define sqr(X) (X*X)
ale potrzebuję czegoś takiego:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
Jak to działa?
To jest tylko przykład, rzeczywiste makro może być bardzo długie.
c++
c
c-preprocessor
hałaśliwy kot
źródło
źródło
Odpowiedzi:
Używasz
\
jako znaku ucieczki kontynuacji linii.#define swap(a, b) { \ (a) ^= (b); \ (b) ^= (a); \ (a) ^= (b); \ }
EDYCJA: Jak @abelenky zauważył w komentarzach,
\
znak musi być ostatnim znakiem w linii . Jeśli tak nie jest (nawet jeśli później jest to po prostu spacja), w każdym kolejnym wierszu pojawią się mylące komunikaty o błędach.źródło
` after all useful lines of the macro, and add a comment afterward saying something like
// pustej linii wymaganej po makrze. It's sometimes easier to ensure that all lines of a macro end with
`, niż upewnienie się, że tak zrobi wszystko oprócz ostatniej.Możesz ustawić makro w wielu wierszach, umieszczając odwrotny ukośnik (
\
) na końcu każdego wiersza:#define F(x) (x) \ * \ (x)
źródło
PROSZĘ PAMIĘTAĆ, jak wskazali Kerrek SB i Coaddict, na co należało zwrócić uwagę w przyjętej odpowiedzi, ZAWSZE umieszczajcie nawiasy wokół argumentów. Przykład sqr jest prostym przykładem nauczanym na kursach CompSci.
Oto problem: jeśli zdefiniujesz to w ten sposób, co się dzieje, gdy mówisz „sqr (1 + 5)”? Otrzymujesz „1 + 5 * 1 + 5” lub 11
Jeśli prawidłowo umieścisz wokół niego nawiasy klamrowe,
#define sqr(x) ((x)*(x))
otrzymasz ((1 + 5) * (1 + 5)) lub to, czego chcieliśmy 36 ... piękne.
Ed S. będzie miał ten sam problem z „zamianą”
źródło
sqr(++i)
? (załóżmy, że mamyint i
) :)i
jest zwiększane, gdy jest podstawiane do makra (w tym przypadku jest podstawiane dwukrotnie), a następnie jest mnożone. A więcsqr(++5) == ((7) * (7))
sqr(++i)
to((++i)*(++i))
wywołałoby niezdefiniowane zachowanie, ponieważ wartośći
jest modyfikowana więcej niż raz w tej instrukcji (brak punktu sekwencji między operacjami).Musisz opuścić nową linię na końcu linii, poprzedzając ją znakiem
\
:#define sqr(X) \ ((X)*(X))
źródło