Tokeneinfügender Operator (##)
Der Operator "Double-number-sign" oder "token-pasting " (##), der manchmal als Zusammenführungs - oder Kombinationsoperator bezeichnet wird, wird sowohl in objektähnlichen als auch in funktionsähnlichen Makros verwendet. Es ermöglicht, separate Token in ein einzelnes Token zu integrieren, und daher kann es sich nicht um das erste oder letzte Token in der Makrodefinition sein.
Wenn ein formaler Parameter in einer Makrodefinition dem Operator „token-pasting“ voran- oder nachgestellt ist, wird der formale Parameter sofort durch das nicht erweiterte tatsächliche Argument ersetzt. Die Makroerweiterung wird nicht vor der Ersetzung für das Argument ausgeführt.
Anschließend wird jedes Vorkommen des Token-Einfügen-Operators in der Tokenzeichenfolge entfernt, und die vorangehenden und folgenden Token werden verkettet. Das daraus resultierende Token muss ein gültiges Token sein. Ist dies der Fall, wird das Token auf eine mögliche Ersetzung überprüft, falls es einen Makronamen darstellt. Der Bezeichner steht für den Namen, unter dem die verketteten Token vor der Ersetzung im Programm bekannt sind. Jedes Token stellt ein an anderer Stelle definiertes Token dar, entweder im Programm oder in der Compilerbefehlszeile. Leerzeichen, die dem Operator vor- oder nachgestellt sind, sind optional.
In diesem Beispiel wird die Verwendung der Zeichenfolgenoperatoren und Operatoren zum Einfügen eines Tokens beim Festlegen der Programmausgabe veranschaulicht:
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
Beim Aufrufen eines Makros mit einem numerischen Argument wie
paster( 9 );
gibt das Makro
printf_s( "token" "9" " = %d", token9 );
aus, das zu Folgendem wird:
printf_s( "token9 = %d", token9 );
Beispiel
// 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