Stringifizierung #

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 diese Direktive liebevoll als Stringifizierung bezeichnet wird. In anderen Quellen wird er auch als Stringoperator oder auf Englisch als Stringizer bezeichnet.






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\"");