Выполняя задачу по макросам попался документ о конкатенации макросов. В нем следующий код:
#define COMMAND(NAME) { #NAME, NAME ## _command }
Макрос NAME ранее определен не был. Но, тем не менее, он воспринимается и работает. Объясните, пожалуйста, как это работает, потому что очень интересна данная конструкция, можно найти ей применение в дальнейшем.
Пример взят вот отсюда
// Макрос COMMAND служит для более короткой записи инициализации структуры command
// Например результат следующих записей одинаков:
// COMMAND(name);
// command c = {"name", name_command};
#define COMMAND(NAME) { #NAME, NAME ## _command }
struct command // Структура для хранения некой комманды
{
char *name;
void (*function) (void); // указатель на функцию
};
// инициализация массива комманд
struct command commands[] =
{
COMMAND (quit), // Команда quit
COMMAND (help), // Команда help
...
};
// Предыдущую инициализацию компилятор "превратит" вот в это
struct command commands[] =
{
{ "quit", quit_command },
{ "help", help_command },
...
};
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости