Par exemple, j'ai une macro:
#define PRINT(int) printf(#int "%d\n",int)
Je sais un peu quel est le résultat. Mais comment se fait-il que #int repousse tout cela?
J'oublie un peu ce détail. Quelqu'un peut-il bien me donner un indice?
Merci!
Dans ce contexte (appliqué à une référence de paramètre dans une définition de macro), le signe dièse signifie étendre ce paramètre au texte littéral de l'argument transmis à la macro.
Dans ce cas, si vous appelez PRINT(5)
l'expansion de macro sera printf("5" "%d\n", 5);
qui affichera 5 5
; pas très utile; cependant si vous appelez PRINT(5+5)
l'expansion de macro sera printf("5+5" "%d\n", 5+5);
qui affichera 5+5 10
, un peu moins trivial.
Cet exemple est expliqué dans ce tutoriel sur le préprocesseur C (qui, soit dit en passant, est le premier hit de Google pour signe de macro macro c ).
"#" peut afficher le nom d'une variable, il est préférable de définir la macro comme ceci:
#define PRINT(i) printf(#i "= %d\n", i)
et utilisez-le comme ceci:
int i = 5;
PRINT(i);
Résultat affiché:
i = 5
C'est un mauvais choix de nom pour le paramètre macro, mais inoffensif (merci dreamlax).
Fondamentalement, si j'écris comme ça
PRINT(5);
Il sera remplacé comme
printf("5" "%d\n",5);
ou
printf("5 %d\n",5);
Il s'agit d'un processus appelé Stringification , #int est remplacé par une chaîne composée de son contenu, 5 -> "5"