2012-05-02 20 views
44

Come creare macro di preprocessore multilinea? So come fare una sola riga:Macro preprocessore multilinea

#define sqr(X) (X*X) 

ma ho bisogno di qualcosa di simile:

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

Come posso ottenere questo lavoro?

Questo è solo un esempio, la macro reale potrebbe essere molto lunga.

+0

È possibile ottenere facilmente la risposta cercando la SO. per esempio. http://stackoverflow.com/questions/4007865/few-questions-about-the-c-preprocessore – CppLearner

+0

diversi metodi sono qui: http://www.parashift.com/c++-faq/macros-with-multi-stmts .html – Ayrat

+0

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

risposta

79

Si utilizza \ come carattere di fuga di continuazione della linea.

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

EDIT: Come @abelenky sottolineato nei commenti, il \ carattere deve essere l'ultimo carattere sulla linea. Se non lo è (anche se è solo uno spazio bianco in seguito) si otterranno confusi messaggi di errore su ciascuna riga dopo di essa.

+27

Una parola di cautela: assicurati che \ sia l'ultimo * * carattere sulla linea. In C, lo spazio bianco in genere non ha importanza, ma in questo caso gli spazi bianchi invisibili alla fine della linea possono ucciderti. – abelenky

+0

@abelenky: buon punto, grazie. –

+2

Si dovrebbe aggiungere che il testo risultante è su una riga però. Poiché C tratta tutto lo spazio bianco tra i token lo stesso di solito non importa molto, ma comunque. –

11

È possibile effettuare una macro si estendono su più righe inserendo un backslash (\) alla fine di ogni riga:

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

+1: per non aver perso le parentesi attorno a 'x'! -) – alk

2

avete bisogno di sfuggire la nuova riga alla fine della linea fuggendo con un \:

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

NOTA come Kerrek SB e coaddict ha sottolineato, che avrebbe dovuto essere sottolineato nella risposta accettata, SEMPRE posiziona le parentesi attorno ai tuoi argomenti. L'esempio di sqr è il semplice esempio insegnato nei corsi CompSci.

Ecco il problema: se lo definisci come hai fatto cosa succede quando dici "sqr (1 + 5)"? si ottiene "1 + 5 * 1 + 5" o 11
Se si posiziona correttamente le parentesi intorno ad esso, #define sqr(x) ((x)*(x))
si ottiene ((1 + 5) * (1 + 5)), o quello che volevamo ... 36 bellissimo.

Ed S. avrà lo stesso problema con "scambio"

+0

come su' sqr (++ i) '? (supponiamo di avere un 'int i') :) –

+0

L'ho fatto come esercizio e apparentemente' i' viene incrementato in quanto viene sostituito nella macro (in questo caso viene sostituito due volte), quindi viene moltiplicato.Quindi 'sqr (++ 5) == ((7) * (7))' – jiveturkey

+1

@ GézaTörök L'espansione di 'sqr (++ i)' a '((++ i) * (++ i))' invocerebbe un comportamento indefinito perché il valore di 'i' viene modificato più di una volta all'interno di tale istruzione (nessun punto di sequenza tra le operazioni). – moooeeeep

Problemi correlati