2012-05-02 31 views
44

¿Cómo hacer macro de preprocesador de múltiples líneas? Yo sé cómo hacer una línea:Macros de preprocesador de varias líneas

#define sqr(X) (X*X) 

pero necesito algo como esto:

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

¿Cómo puedo conseguir que esto funcione?

Esto es solo un ejemplo, la macro real puede ser muy larga.

+0

Puede obtener fácilmente la respuesta buscando en el SO. p.ej. http://stackoverflow.com/questions/4007865/few-questions-about-the-c-preprocessor – CppLearner

+0

diferentes métodos están aquí: http://www.parashift.com/c++-faq/macros-with-multi-stmts .html – Ayrat

+0

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

Respuesta

79

Utiliza \ como un carácter de continuación de escape de línea.

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

EDIT: Como @abelenky señaló en los comentarios, el carácter \debe ser el último carácter de la línea. Si no lo está (incluso si es solo un espacio en blanco después), recibirá mensajes de error confusos en cada línea después de él.

+27

Una palabra de advertencia: asegúrese de que \ es el ** último * * personaje en la línea. En C, el espacio en blanco normalmente no importa, pero en este caso, el espacio en blanco invisible al final de la línea puede matarte. – abelenky

+0

@abelenky: Buen punto, gracias. –

+2

Uno debería agregar que el texto resultante está en una línea. Como C trata a todos los espacios en blanco entre tokens de la misma manera, generalmente no importa mucho, pero aún así. –

11

Usted puede hacer una macro ocupar varias líneas, poniendo una barra invertida (\) al final de cada línea:

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

+1: por no haber perdido los corchetes alrededor de 'x'! -) – alk

2

tiene que escapar de la nueva línea al final de la línea de escape con una \:

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

NOTA como kerrek SB y coaddict señalaron, que debería haber sido señalado en la respuesta aceptada, SIEMPRE coloque llaves alrededor de sus argumentos. El ejemplo sqr es el ejemplo simple que se enseña en los cursos CompSci.

Este es el problema: si lo define como lo hizo, ¿qué sucede cuando dice "sqr (1 + 5)"? que se obtiene "1 + 1 + 5 * 5" o 11
Si se coloca correctamente los apoyos a su alrededor, #define sqr(x) ((x)*(x))
se obtiene ((1 + 5) * (1 + 5)) o lo que queríamos ... 36 hermosa.

Ed S. va a tener el mismo problema con 'swap'

+0

¿qué tal' sqr (++ i) '? (supongamos que tenemos un 'int i') :) –

+0

Lo hice como un ejercicio y aparentemente' i' se incrementa al ser sustituido en la macro (en este caso se sustituye dos veces), luego se multiplica.Entonces 'sqr (++ 5) == ((7) * (7))' – jiveturkey

+1

@ GézaTörök La expansión de 'sqr (++ i)' a '((++ i) * (++ i))' invocaría un comportamiento indefinido porque el valor de 'i' se modifica más de una vez dentro de esa declaración (no hay punto de secuencia entre las operaciones). – moooeeeep

Cuestiones relacionadas