Официальное имя #
- это оператор строкового преобразования . Он принимает аргумент и заключает его в кавычки, чтобы сделать строку C константой, избегая при необходимости любых встроенных кавычек или обратной косой черты. Это разрешено только внутри определения макроса - это не разрешено в обычном коде. Например:
// This is not legal C
const char *str = #test
// This is ok
#define STRINGIZE(x) #x
const char *str1 = STRINGIZE(test); // equivalent to str1 = "test";
const char *str2 = STRINGIZE(test2"a\""); // equivalent to str2 = "test2\"a\\\"";
Связанным оператором препроцессора является оператор вставки токена ##
. Для получения одного токена требуется два токена и вставка их вместе. Как и оператор строкового преобразования, он допускается только в определениях макросов, а не в обычном коде.
// This is not legal C
int foobar = 3;
int x = foo ## bar;
// This is ok
#define TOKENPASTE(x, y) x ## y
int foobar = 3;
int x = TOKENPASTE(foo, bar); // equivalent to x = foobar;