Имеется два оператора препроцессора: # и ##. Они применяются в сочетании с оператором #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);
Если эти операторы покажутся вам незнакомыми, то надо помнить вот о чем: они не являются необходимыми и не используются в большинстве программ. В общем-то, эти операторы предусмотрены для работы препроцессора в некоторых особых случаях.