Препроцессор 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 [] = соединение (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 дает ##, а не "##" или "#" "#". Какую роль играют одиночные хеш-коды до и после игры с двойным хешем?

Любые ответы приветствуются.

16
задан a3f 31 March 2015 в 01:37
поделиться