Подтвердить что ты не робот

C препроцессора # и ##

стандартный документ C99 имеет следующий пример в разделе, связанном с оператором препроцессора ##:

В следующем фрагменте:

#define hash_hash # ## #
#define mkstr(a) # a
#define in_between(a) mkstr(a)
#define join(c, d) in_between(c hash_hash d)

char p[] = join(x, y); // equivalent to
                       // char p[] = "x ## y";

Расширение производит на различных этапы:

join(x, y)
in_between(x hash_hash y)
in_between(x ## y)
mkstr(x ## y)
"x ## y"

Другими словами, расширение hash_hash создает новый токен, состоящий из два смежных острых знака, но этот новый токен не является оператором ##.

Я не понимаю, почему подстановка hash_hash вызывает ##, а не "##" или "#" "#". Какую роль играют отдельные хэши до и после двойного хэша?

Любые ответы были высоко оценены.

4b9b3361

Ответ 1

## в # ## # действует как escape-последовательность в этом выражении. Он объединяет самые левые и самые правые #, чтобы, наконец, получить токен ##. Простое определение макроса как ## приведет к ошибке, так как оператор конкатенации ожидает два операнда.