web-dev-qa-db-fra.com

Que signifie #x dans une macro C?

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!

43
Anders Lind

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 ).

45
metamatt

"#" 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
15
Jack Peking

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"

6
Karthik T