стандартный документ 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 вызывает ##, а не "##" или "#" "#". Какую роль играют отдельные хэши до и после двойного хэша?
Любые ответы были высоко оценены.