Operatore di concatenamento dei token (##)
L'operatore double-number-sign o token-incolla (), che a volte viene chiamato operatore di unione o combinazione, viene usato sia nelle macro simili a oggetti che in macro simili a funzioni.## Consente l'aggiunta di token separati in un singolo token e pertanto non può essere il primo o l'ultimo token nella definizione della macro.
Se un parametro formale in una definizione di macro è preceduto o seguito dall'operatore di concatenamento dei token, il parametro formale viene immediatamente sostituito dall'argomento effettivo non espanso. L'espansione della macro non viene eseguita nell'argomento prima della sostituzione.
Ogni occorrenza dell'operatore token incollato nella stringa di token viene quindi rimossa e i token precedenti e successivi vengono concatenati. Il token risultante deve essere un token valido. In tal caso, viene eseguita la scansione del token per una possibile sostituzione se rappresenta un nome di macro. L'identificatore rappresenta il nome da cui i token concatenati verranno resi noti nel programma prima della sostituzione. Ogni token rappresenta un token definito altrove, nel programma o nella riga di comando del compilatore. Lo spazio vuoto che precede o che segue l'operatore è facoltativo.
In questo esempio viene illustrato l'utilizzo degli operatori di creazione di stringhe e di concatenamento dei token nella specifica dell'output del programma:
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
Se una macro viene chiamata con un argomento numerico come
paster( 9 );
la macro restituisce
printf_s( "token" "9" " = %d", token9 );
che diventa
printf_s( "token9 = %d", token9 );
Esempio
// 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