Я знаю, что:
#define foo 4
#define str(s) #s
с str(foo) выписывает: "foo", потому что stringify выполняется сначала из расширения текста, но это:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
с xstr(foo) выписывает: "4".
Почему? Каковы шаги, участвующие в этом процессе?