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