web-dev-qa-db-fra.com

Macros de préprocesseurs multilignes

Comment créer une macro de préprocesseur multiligne? Je sais faire une ligne:

#define sqr(X) (X*X)

mais j'ai besoin de quelque chose comme ça:

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

Comment puis-je le faire fonctionner?

Ce n’est qu’un exemple, la macro réelle peut être très longue.

62
noisy cat

Tu utilises \ comme caractère d'échappement d'une continuation de ligne.

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

EDIT: Comme @abelenky l'a souligné dans les commentaires, le \ caractère doit être le dernier caractère de la ligne. Si ce n'est pas le cas (même s'il ne s'agit que d'un espace blanc par la suite), vous obtiendrez des messages d'erreur confus sur chaque ligne après celle-ci.

100
Ed S.

Vous pouvez faire en sorte qu'une macro s'étende sur plusieurs lignes en mettant une barre oblique inverse (\) à la fin de chaque ligne:

#define F(x) (x)   \
              *    \
             (x)
15
Kerrek SB

NOTEZ S'IL VOUS PLAÎT comme l'ont souligné Kerrek SB et coaddict, ce qui aurait dû être souligné dans la réponse acceptée, TOUJOURS Placez des accolades autour de vos arguments. L'exemple sqr est l'exemple simple enseigné dans les cours CompSci.

Voici le problème: si vous le définissez comme vous l'avez fait, que se passe-t-il quand vous dites "sqr (1 + 5)"? Vous obtenez "1 + 5 * 1 + 5" ou 11
Si vous placez correctement des accolades autour de lui, #define sqr(x) ((x)*(x))
Vous obtenez ((1 + 5) * (1 + 5)) ou ce que nous voulions 36 ... magnifique.

Ed S. va avoir le même problème avec 'swap'

13
jiveturkey

Vous devez échapper à la nouvelle ligne à la fin de la ligne en l’échappant avec un \:

#define sqr(X) \
        ((X)*(X))
3
codaddict