Подтвердить что ты не робот

Что означает двойной хеш (##) в макросе?

В приведенном ниже коде, что делает ##?

 #define MAKE_TYPE(myname) \
 typedef int myname ## Id; \
4b9b3361

Ответ 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