Имеется два оператора препроцессора: # и ##. Они применяются в сочетании с оператором #define.
Оператор #, который обычно называют оператором превращения в строку (stringize), превращает аргумент, перед которым стоит, в строку, заключенную в кавычки. Рассмотрим, например, следующую программу:
#include <stdio.h> #define mkstr(s) # s int main(void) { printf(mkstr(Мне нравится C)); return 0; }
Препроцессор превращает строку
printf(mkstr(Мне нравится C));
в
printf("Мне нравится C");
Оператор ##, который называют оператором склеивания (pasting), или конкатенации конкатенирует две лексемы. Рассмотрим, например, программу
#include <stdio.h> #define concat(a, b) a ## b int main(void) { int xy = 10; printf("%d", concat(x, y)); return 0; }
Препроцессор преобразует
printf("%d", concat(x, y));
в
printf("%d", xy);
Если эти операторы покажутся вам незнакомыми, то надо помнить вот о чем: они не являются необходимыми и не используются в большинстве программ. В общем-то, эти операторы предусмотрены для работы препроцессора в некоторых особых случаях.