Я нашел интересное небольшое сообщение в блоге, в котором объясняется, как сгенерировать (полу) уникальные имена в макросе, используя номер строки:
// Do magic! Creates a unique name using the line number
#define LINE_NAME( prefix ) JOIN( prefix, __LINE__ )
#define JOIN( symbol1, symbol2 ) _DO_JOIN( symbol1, symbol2 )
#define _DO_JOIN( symbol1, symbol2 ) symbol1##symbol2
Есть две вещи, которые меня действительно путают:
- Почему макрос
LINE_NAME
работает даже после объявленияJOIN
после него в файле? Я думал, что препроцессор C выполнил линейный проход и, следовательно, для определения макросов нужно было бы определить на основе зависимости, точно так же, как функции C должны быть определены до их использования. - Почему для получения правильного результата необходимо использовать макросы
JOIN
и_DO_JOIN
? Наличие такого уровня косвенности в макросах кажется очень странным.
У меня такое чувство, что ответы на оба эти вопроса связаны друг с другом и связаны с тем, как препроцессор C оценивает макросы. (Тем не менее, моя интуиция о том, как работают макросы, по-видимому, сработала, поскольку я даже не думал, что пример действителен.)