Как разворачивается данный макрос?

138
06 июля 2019, 09:10

Выполняя задачу по макросам попался документ о конкатенации макросов. В нем следующий код:

#define COMMAND(NAME)  { #NAME, NAME ## _command }

Макрос NAME ранее определен не был. Но, тем не менее, он воспринимается и работает. Объясните, пожалуйста, как это работает, потому что очень интересна данная конструкция, можно найти ей применение в дальнейшем.

Answer 1

Пример взят вот отсюда

 // Макрос 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 },
   ...
 };
READ ALSO
SQRT decomposition 2D

SQRT decomposition 2D

Есть площадь заданного размера, на ней указаны N точек, и даны их координатыНужно научиться быстро отвечать на запрос сколько точек находится...

166
Не могу обратиться к полю в class

Не могу обратиться к полю в class

После компилиции выдает ошибку "Это объявление не содержит класс хранения или спецификатор типа"

151
CSRC и SSRC в RTP

CSRC и SSRC в RTP

Реализую протокол RTP, не могу разобраться с RTP Payload Format for H264 Video а если точнее быть то с первыми 4 байтами в CSRC

148
Установка библиотеки BLAS в MVS

Установка библиотеки BLAS в MVS

3дравствуйте, пытаюсь установить библиотеку BLAS в MVS, делаю все по инструкции, остановился на одном моменте(скриншот приложил)

169