String-Operator #

Wird in einer parametrisierten Makrodefinition einem Makro-Parameter ein einzelnes # vorangestellt, bewirkt dies, dass der Makro-Parameter nicht einfach mit dem übergebenen Argument ersetzt wird, sondern dass der übergebene Code als String in doppelten Anführungszeichen "" interpretiert wird, weswegen dieser Operator auch liebevoll als Stringifizierer oder auf Englisch als Stringizer bezeichnet wird.






i: 5
i+1: 6
#include <stdio.h>
#define MESSAGE(x) printf("%s: %d\n", #x, x)

int main(){
  int i = 5;
  MESSAGE(i);
  MESSAGE(i+1);
  return 0;
}

Details

Nachfolgend die beiden Zeilen, wie der Preprozessor sie übersetzt:

printf("%s: %d\n", "i", i);
printf("%s: %d\n", "i+1", i+1);
MESSAGE(i);
MESSAGE(i+1);

Es ist zu beachten, dass das Zeichen # hier einen Makro-Operator darstellt, sprich eine Verknüpfung von Makro-Operanden. In diesem Falle handelt es sich um einen unären Makro-Operator, der einen Operanden rechts erwartet. Als Operanden sind bei der Stringifizierung explizit nur Makro-Parameter gültig. Wird versucht, dieser Makro-Operator anderweitig im Code zu verwenden, so wir der Compiler einen Fehler melden.

Sollte der zu stringifizierende Operand doppelte Anführungszeichen beinhalten, so werden diese automatisch vom Preprozessor mit Escape-Sequenzen eingebettet.





"Hello"
#include <stdio.h>
#define STRING(x) #x

int main(){
  printf(STRING("Hello"));
  return 0;
}

Nachfolgend die Zeile, wie der Preprozessor sie übersetzt:

printf("\"Hello\"");