Будучи новичком, мне трудно понять следующее утверждение
а) Если в списке замены функциональный макрос, параметр непосредственно предшествует или сопровождается ## токен предварительной обработки, параметр заменяется на соответствующий маркер предварительной обработки аргумента последовательность; б) как для объектоподобных, так и для функциональные вызовы макросов, до замены списка пересмотрены для большего количества имен макросов заменить каждый экземпляр ## токен предварительной обработки при замене список (не из аргумента) удаляется и предыдущий токен предварительной обработки связан со следующим токен предварительной обработки
а) Если в списке замены функциональный макрос, параметр непосредственно предшествует или сопровождается ## токен предварительной обработки, параметр заменяется на соответствующий маркер предварительной обработки аргумента последовательность;
б) как для объектоподобных, так и для функциональные вызовы макросов, до замены списка пересмотрены для большего количества имен макросов заменить каждый экземпляр ## токен предварительной обработки при замене список (не из аргумента) удаляется и предыдущий токен предварительной обработки связан со следующим токен предварительной обработки
Не могли бы вы помочь мне понять приведенное выше утверждение с помощью простого примера
Macro
#define MAKE_EVENT_HANDLER(x) void On##x(void) {
Использование
MAKE_EVENT_HANDLER(MouseClick) /* Do stuff */ } // End of function
Как это расширяется
void OnMouseClick(void) { /* Do stuff */ }
Некоторое время назад я написал пару статей, посвященных препроцессору. Они содержат как технические вещи, так и фольклор. Часть 2 охватывает операторы # и ##.
Часть 1: Основы использования препроцессора
Часть 2: Расширенные советы и приемы препроцессора
Википедия имеет хорошую иллюстрацию -> вставка токена