С предоставляет два оператора препроцессора: # и ##. Данные операторы используются в совокупности c #define.
Оператор # помещает аргумент, перед которым он стоит, в двойные кавычки. Например, рассмотрим программу:
#include "stdio.h"
#define mkstr(s) # s
int main(void)
{
printf(mkstr(I like C) );
return 0;
}
Препроцессор превратит строку
printf(mkstr(I like C));
в строку
printf ("I like С");
Оператор ## используется для конкатенации двух частей. Например:
#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);
Если эти операторы кажутся несколько странными, то надо запомнить, что в подавляющем большинстве случаев нет никакой необходимости в их использовании. Их изначальное назначение в том, чтобы позволить препроцессору обрабатывать некоторые специальные случаи.