Operator wklejania tokenu (##)
Operator double-number-sign lub "wklejania tokenów" (##), nazywany czasem operatorem "scalania", jest używany w makrach podobnych do obiektów lub funkcji.Pozwala na łączenie osobnych tokenów w pojedynczy token i z tego powodu nie może być pierwszym ani ostatnim tokenem w definicji makra.
Jeśli parametr formalny w definicji makra jest poprzedzony lub poprzedza operator wklejania tokenów, to parametr formalny jest natychmiast zamieniany przez nierozwinięty argument rzeczywisty.Rozwinięcie makra nie jest wykonywane na argumencie przed zastąpieniem.
Następnie, każde wystąpienie operatora wklejania tokenów w token-string jest usuwane, a tokeny przed i po nim łączone.Wynikowy token musi być prawidłowym tokenem.Jeśli jest, token jest skanowany w poszukiwaniu ewentualnego, możliwego zastąpienia, o ile reprezentuje nazwę makra.Identyfikator reprezentuje nazwę, dzięki której łączone tokeny będą znane w programie przed zastąpieniem.Każdy token reprezentuje token zdefiniowany w innym miejscu, w ramach programu lub w wierszu polecenia kompilatora.Białe znaki poprzedzające lub następujące po operatorze są opcjonalne.
Ten przykład ilustruje użycie zarówno operatorów konwersji na ciąg, jak i wklejania tokenów do określonych danych wyjściowych programu:
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
Jeśli makro zostanie wywołane z argumentem liczbowym, takim jak
paster( 9 );
to makro zwróci
printf_s( "token" "9" " = %d", token9 );
które stanie się
printf_s( "token9 = %d", token9 );
Przykład
// preprocessor_token_pasting.cpp
#include <stdio.h>
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
int main()
{
paster(9);
}