Operator wklejania tokenu (##)

Operator podwójnego znaku liczbowego lub wklejania tokenu (##), który jest czasami nazywany operatorem scalania lub łączenia, jest używany zarówno w makrach przypominających obiekty, jak i podobnych do funkcji. Zezwala na łączenie oddzielnych tokenów w jednym tokenie i dlatego nie może być pierwszym ani ostatnim tokenem w definicji makra.

Jeśli parametr formalny w definicji makra jest poprzedzony lub następuje po nim operator wklejania tokenów, parametr formalny jest natychmiast zastępowany przez niezdefiniowany rzeczywisty argument. Rozszerzenie makra nie jest wykonywane na argumencie przed zastąpieniem.

Następnie każde wystąpienie operatora wklejania tokenu w ciągu tokenu jest usuwane, a tokeny poprzedzające i następujące po nim są łączone. Wynikowy token musi być prawidłowym tokenem. Jeśli tak jest, token jest skanowany pod kątem ewentualnego zastąpienia, jeśli reprezentuje nazwę makra. Identyfikator reprezentuje nazwę, za pomocą której łączenie tokenów będzie znane w programie przed zastąpieniem. Każdy token reprezentuje token zdefiniowany gdzie indziej w programie lub w wierszu polecenia kompilatora. Biały znak poprzedzający lub następujący po operatorze jest opcjonalny.

W tym przykładzie pokazano użycie operatorów ciągowania i wklejania tokenów w określaniu danych wyjściowych programu:

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

Jeśli makro jest wywoływane z argumentem liczbowym, na przykład

paster( 9 );

makro daje

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

co staje 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);
}
token9 = 9

Zobacz też

Operatory preprocesora