В стандартном документе 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 [] = соединение (x, y); // эквивалентно // char p [] = "x ## y";
Расширение производит, в различных этапы:
join (x, y) in_between (x hash_hash y) in_between (x ## y) mkstr (x ## y) «х ## у»
Другими словами, расширение hash_hash производит новый токен, состоящий из два соседних острых знака, но этот новый токен не является оператором ##.
Я не понимаю, почему замена hash_hash дает ##, а не "##" или "#" "#". Какую роль играют одиночные хеш-коды до и после игры с двойным хешем?
Любые ответы приветствуются.