Udostępnij za pośrednictwem


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);
}
  

Zobacz też

Informacje

Operatory preprocesora