¿Cómo hacer una macro de preprocesador de varias líneas? Sé cómo hacer una línea:
#define sqr(X) (X*X)
pero necesito algo como esto:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
¿Cómo puedo hacer que esto funcione?
Este es solo un ejemplo, la macro real puede ser muy larga.
c++
c
c-preprocessor
gato ruidoso
fuente
fuente
Respuestas:
Se utiliza
\
como carácter de escape de continuación de línea.#define swap(a, b) { \ (a) ^= (b); \ (b) ^= (a); \ (a) ^= (b); \ }
EDITAR: Como @abelenky señaló en los comentarios, el
\
carácter debe ser el último carácter de la línea . Si no es así (incluso si es solo un espacio en blanco después), obtendrá mensajes de error confusos en cada línea posterior.fuente
` after all useful lines of the macro, and add a comment afterward saying something like
// Línea en blanco requerida después de la macro. It's sometimes easier to ensure that all lines of a macro end with
`que para asegurarse de que todas las líneas menos la última lo hagan .Puede hacer que una macro abarque varias líneas colocando una barra invertida (
\
) al final de cada línea:#define F(x) (x) \ * \ (x)
fuente
TENGA EN CUENTA que como señalaron Kerrek SB y coaddict, 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 de CompSci.
Aquí está el problema: si lo define de la forma en que lo hizo, ¿qué sucede cuando dice "sqr (1 + 5)"? Obtienes "1 + 5 * 1 + 5" o 11.
Si colocas correctamente los tirantes,
#define sqr(x) ((x)*(x))
obtienes ((1 + 5) * (1 + 5)) o lo que queríamos 36 ... hermoso.
Ed S. va a tener el mismo problema con 'swap'
fuente
sqr(++i)
? (supongamos que tenemos unint i
) :)i
se incrementa a medida que se sustituye en la macro (en este caso se sustituye dos veces), luego se multiplica. Así quesqr(++5) == ((7) * (7))
sqr(++i)
to((++i)*(++i))
invocaría un comportamiento indefinido porque el valor dei
se modifica más de una vez dentro de esa declaración (sin punto de secuencia entre las operaciones).Debe escapar de la nueva línea al final de la línea escapándose con un
\
:#define sqr(X) \ ((X)*(X))
fuente