#define MAKE_TYPE(myname) \
typedef int myname ## Id; \
Ответ 1
## в макросе есть конкатенация. Здесь MAKE_TYPE(test) будет расширяться до: typedef int testId.
Из 16.3.3 (Оператор ##):
Как для объектов, так и для функций макросов, перед список заметок пересматривается для больше имен макросов для замены, каждый экземпляр токена ## предварительной обработки в списке замещения (не из аргумент) удаляется, а предыдущий токен предварительной обработки конкатенирован со следующим токеном предварительной обработки
Ответ 2
icecrime верен, но что-то важное в определении заключается в том, что токены должны быть действительными токенами предварительной обработки. Примеры:
#define CONCAT(a,b) a ## b
CONCAT(ClassyClass, <int>); // bad, <int> is not a valid preprocessing token
CONCAT(Symbol, __LINE__); // valid as both are valid tokens