В статье по реализации делегатов на С++ надо было получить лексему через макросы:
#define SUFFIX 5
#define COMBINE(a,b) COMBINE1(a,b)
#define COMBINE1(a,b) a##b
#define I_DELEGATE COMBINE(IDelegate, SUFFIX)
#define C_STATIC_DELEGATE COMBINE(CStaticDelegate, SUFFIX)
#define C_METHOD_DELEGATE COMBINE(CMethodDelegate, SUFFIX)
#define C_DELEGATE COMBINE(CDelegate, SUFFIX)
К чему здесь COMBINE1? Я согласен, что в ином случае код не компилиться...
Вроде бы вот что происходит:
1) Строчка
#define I_DELEGATE COMBINE(IDelegate, SUFFIX)
меняеться на
#define I_DELEGATE COMBINE(IDelegate, 5)
2) Потом, когда в где-нибудь в коде встретиться I_DELEGATE (или др.), то выполниться макром
#define COMBINE(a,b) COMBINE1(a,b)
но ведь если a — это I_DELEGATE и b — это 5, то вполне возможно написать и такое:
#define COMBINE(a,b) a##b
Но я уверен, что заюлуждаюсь, т.к. это неправельно... Зачем все-таки нужен этот промежуточный макрос?