J'implémente la macro X, mais j'ai un problème avec une simple extension de macro. Cette macro (voir ci-dessous) est utilisée dans plusieurs exemples d'utilisation de macros, en incluant dans l'article this
. Le compilateur donne un message d'erreur, mais je peux voir un code C valide en utilisant l'indicateur -E
Avec le compilateur GCC.
La macro X-list est définie comme suit:
#define LIST \
X(red, "red") \
X(blue, "blue") \
X(yellow, "yellow")
Puis:
#define X(a, b) foo.##a = -1;
LIST;
#undef X
Mais le gcc a donné les messages d'erreur suivants:
lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
Comme je l'ai dit, je peux voir un code C valide en utilisant le commutateur -E
Sur gcc:
lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
foo.red = -1; foo.blue = -1; foo.yellow = -1;;
Qu'est-ce qu'un jeton de prétraitement valide? Quelqu'un peut-il expliquer cela?
(avant de dire "pourquoi pas juste une initialisation ou une memset()
?" ce n'est pas mon vrai code.)
.
sépare les jetons et vous ne pouvez donc pas utiliser ##
comme .red
n'est pas un jeton valide. Vous utiliseriez uniquement ##
si vous concaténiez deux jetons en un seul.
Cela marche:
#define X(a, b) foo.a = -1;
Qu'est-ce qu'un jeton de prétraitement valide? Quelqu'un peut-il expliquer cela?
C'est ce qui est analysé/lexé. foo.bar
serait analysé comme 3 jetons (deux identifiants et un opérateur): foo . bar
Si tu utilises ##
vous obtiendrez seulement 2 jetons (un identifiant et un jeton invalide): foo .bar