Opérateur de collage de jeton (##)

L’opérateur de collage de jetons ou de signe double nombre (##, parfois appelé opérateur de fusion ou de combinaison, est utilisé dans les macros de type objet et de type fonction. Il permet de joindre des jetons distincts à un seul jeton. Par conséquent, il ne peut pas s’agir du premier ou du dernier jeton dans la définition de macro.

Si un paramètre formel d’une définition de macro est précédé ou suivi d’un opérateur de collage de jeton, le paramètre formel est immédiatement remplacé par l’argument réel non étendu. L’expansion de macro n’est pas exécutée sur l’argument avant son remplacement.

Ensuite, chaque occurrence de l’opérateur de collage de jetons dans la chaîne de jeton est supprimée, et les jetons précédents et suivants sont concaténés. Le jeton résultant doit être un jeton valide. Dans ce cas, le jeton est analysé en vue de son remplacement éventuel lorsqu'il représente un nom de macro. L'identificateur représente le nom sous lequel les jetons concaténés sont connus dans le programme avant leur remplacement. Chaque jeton représente un jeton défini ailleurs, soit dans le programme, soit sur la ligne de commande du compilateur. L'espace blanc précédent ou suivant l'opérateur est facultatif.

Cet exemple illustre l'utilisation de l'opérateur stringizing et de l'opérateur de collage de jeton lors de la spécification de la sortie du programme :

#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;

Si une macro est appelée avec un argument numérique comme

paster( 9 );

la macro génère

printf_s( "token" "9" " = %d", token9 );

qui devient

printf_s( "token9 = %d", token9 );

Exemple

// preprocessor_token_pasting.cpp
#include <stdio.h>
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;

int main()
{
   paster(9);
}
token9 = 9

Voir aussi

Opérateurs de préprocesseur