Multi ligne macros du préprocesseur
La façon de faire du multi en ligne de macro préprocesseur? Je sais comment faire une ligne:
#define sqr(X) (X*X)
mais j'ai besoin de quelque chose comme ceci:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
Comment puis-je obtenir que cela fonctionne?
Ce n'est qu'un exemple, la vraie macro peut être très long.
- Vous pouvez facilement obtenir la réponse par la recherche de la SORTE. par exemple, stackoverflow.com/questions/4007865/...
- différentes méthodes sont ici: parashift.com/c++-faq/macros-with-multi-stmts.html
- Connexes: stackoverflow.com/questions/98944/...
Vous devez vous connecter pour publier un commentaire.
Vous utilisez
\
comme une suite de ligne de caractère d'échappement.EDIT: Comme @abelenky souligné dans les commentaires, le
\
caractère doit être le dernier caractère de la ligne. Si elle ne l'est pas (même si c'est juste un espace blanc par la suite), vous obtiendrez confusion des messages d'erreur sur chaque ligne après elle.` after all useful lines of the macro, and add a comment afterward saying something like
// ligne Vide nécessaire après macro. It's sometimes easier to ensure that all lines of a macro end with
` qu'à assurer à tous, mais la dernière ligne fait.Vous pouvez faire une macro s'étendent sur plusieurs lignes en mettant une barre oblique inverse (
\
) à la fin de chaque ligne:x
!-)REMARQUE comme Kerrek SB et coaddict pointu, qui ont été signalées dans de la accepté de répondre,
TOUJOURS place des accolades autour de vos arguments. Le sqr exemple est l'exemple simple enseigné en fac d'informatique cours.
Voici le problème: Si vous définissez la façon dont vous avez ce qui se passe quand vous dites "sqr(1+5)"?
Vous obtenez "1+5*1+5" ou 11
Si vous placer correctement les accolades autour d'elle,
#define sqr(x) ((x)*(x))
vous obtenez ((1+5) * (1+5)) ou ce que nous voulions 36 ...belle.
Ed S. va avoir le même problème avec "swap"
sqr(++i)
? (supposons que nous avons unint i
) 🙂i
est incrémenté comme il est substitué dans la macro (dans ce cas, il est remplacé, deux fois), puis il est multiplié. Doncsqr(++5) == ((7) * (7))
sqr(++i)
à((++i)*(++i))
invoque un comportement indéfini, parce que la valeur dei
est modifié plus d'une fois à l'intérieur de cette déclaration (pas de point de séquence entre les opérations).Vous avez besoin pour échapper à la nouvelle ligne à la fin de la ligne par prendre la fuite avec un
\
: