понимание макросов в C и директив препроцессора - PullRequest
0 голосов
/ 30 сентября 2018

Я не понимаю эти макросы, как это работает ?, и что такое irc _ ## name? .. У меня есть этот код от IRC-бота insobot, вот код https://github.com/baines/insobot/blob/master/src/insobot.c

#define IRC_CALLBACK_BASE(name, event_type) static void irc_##name ( \
irc_session_t* session, \
event_type     event,   \
const char*    origin,  \
const char**   params,  \
unsigned int   count    \
)

#define IRC_STR_CALLBACK(name) IRC_CALLBACK_BASE(name, const char*)
#define IRC_NUM_CALLBACK(name) IRC_CALLBACK_BASE(name, unsigned int)

1 Ответ

0 голосов
/ 30 сентября 2018

## является оператором конкатенации токенов: он используется в этих определениях макросов для создания идентификатора имени функции обратного вызова, добавляя irc_ перед значением первого аргумента макроса IRC_STR_CALLBACK и /или IRC_NUM_CALLBACK

Посмотрите на этот вызов макроса в строке 183:

IRC_STR_CALLBACK(on_join);

эта исходная строка расширилась до

static void irc_on_join ( irc_session_t* session, event_type     event,   const char*    origin,  const char**   params,  unsigned int   count    );

Макрос используется для объявленияобработчик согласованным образом без необходимости явной записи прототипа, что удобно, поскольку в этом исходном файле много обработчиков.

...