Konkatenations-Operator ##

Das doppelte ## ist ein Makro-Operator, der eine Konkatenation der beiden Operanden links und rechts ohne zusätzlichen Abstand bewirkt. Dadurch wird aus zwei Symbolen eines, weswegen dieser Makro-Operator auch Symboloperator und im Englischen als Tokenizer bezeichnet wird. Im folgenden Beispiel wird automatisch die Float-Variante der übergebenen Mathematik-Funktion aufgerufen:






PI = 3.000000
#include <stdio.h>
#include <math.h>
#define MATH(func, args) func ## f (args)

int main(){
  printf("PI = %f\n", MATH(floor, 3.14));
  return 0;
}

Details

Obige Zeile wird folgendermassen übersetzt:

printf("PI = %f\n", floorf (3.14));

Ist einer der Operanden links oder rechts ein Makro, so wird dieses grundsätzlich NICHT aufgelöst. Die einzige Ausnahme zu dieser Regel ist das __VA_ARGS__ Makro, welches korrekt ausgewertet wird. Folgende Zeilen illustrieren dies:



floorSUFFIX (3.14);


floorf (3.14);
#define SUFFIX f
#define MATH(func, args) func ## SUFFIX (args)
MATH(floor, 3.14);

#define MATH(func, args, ...) func ## __VA_ARGS__ (args)
MATH(floor, 3.14, f);

Als Operanden sind beliebige Preprozessor-Tokens erlaubt, solange die Zusammensetzung wiederum ein gültiges Preprozessor-Token ergibt. Wird versucht, dieser Makro-Operator ausserhalb einer #define-Direktive im Code zu verwenden, so wird der Compiler einen Fehler melden.

Eine Spezial-Bedeutung des doppelten Hash-Zeichens ## findet sich bei GCC für variadische Makros.