Passer la valeur d’une variable à une macro en C

J’essaie de transmettre la valeur d’une variable à une macro en C, mais je ne sais pas si cela est possible. Exemple:

#include  #define CONCVAR(_n) x ## _n int main () { int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; int i; for (i = 0; i <= 9; i++) CONCVAR(i) = i*5; return 0; } 

Ici, j’essaie d’utiliser une macro pour atsortingbuer une valeur à toutes les variables x_, à l’aide de jetons ## . Je sais que je peux facilement y parvenir avec des tableaux, mais cela ne sert qu’à des fins d’apprentissage.

CONCVAR(i) est substitué à xi et non à x1 (si i == 1). Je sais comment définit et fonctionne la macro, tout est une question de substitution, mais je veux savoir s’il est possible de passer la valeur de i à la place de la lettre i à une macro.

Il est impossible de substituer la valeur de i à la macro, car les substitutions de macros ont lieu avant la compilation de votre code. Si vous utilisez GCC, vous pouvez voir la sortie du préprocesseur en ajoutant l’argument de ligne de commande ‘-E’ (notez cependant que tous les # include sont insérés dans votre code.)

C est un langage statique et vous ne pouvez pas décider de noms de symbole au moment de l’exécution. Cependant, ce que vous essayez d’atteindre est possible si vous utilisez un tableau et faites référence à des éléments utilisant des indices. En règle générale, si vous avez beaucoup de variables comme x0, x1, etc., vous devriez probablement utiliser un conteneur comme un tableau.

Non, car la valeur de i n’existe qu’au moment de l’ exécution . L’expansion de la macro a lieu à la compilation .

Non, ça ne marchera pas. Le pré-processeur C / C ++ est simplement un traitement de texte “pré-compilé”. En tant que tel, il agit sur le texte trouvé tel quel dans votre code source.

C’est pourquoi, il faut le texte littéral “i”, le transférer dans votre macro, puis le développer dans le texte littéral “xi” de votre code source. Ensuite, cela est transmis au compilateur. Le compilateur commence alors à parsingr le texte post-traité, en trouvant le jeton littéral “xi” en tant que variable non déclarée et en s’immiscant dans le processus.

Vous pouvez prendre votre exemple de code source et le transmettre à un compilateur gcc (j’ai utilisé gcc sous cygwin par exemple, en collant votre code dans un fichier que j’ai nommé pimp.c, faute d’un meilleur nom). Ensuite, vous obtiendrez ce qui suit:

 $ gcc pimp.c pimp.c: In function `main': pimp.c:9: error: `xi' undeclared (first use in this function) pimp.c:9: error: (Each undeclared identifier is reported only once pimp.c:9: error: for each function it appears in.) 

En bref, non, vous ne pouvez pas faire cela. Pour être en mesure de faire cela, le pré-processeur devrait alors jouer le rôle d’interprète. C et C ++ ne sont (généralement) pas des langages interprétés et le pré-processeur n’est pas un interpréteur. Ma suggestion serait d’expliquer très clairement les différences entre les compilateurs et les interprètes (et entre les langages compilés et interprétés).

Cordialement.