Макрос X - это метод надежного обслуживания параллельных списков кода или данных, соответствующие элементы которых должны появиться в том же порядке. Они наиболее полезны там, где, по крайней мере, некоторые списки не могут быть составлены путем индексации, например, время компиляции.
Примеры таких списков, в частности, включают инициализацию массивов в сочетании с объявлениями констант перечисления и прототипов функций, генерацию последовательности операторов, переключатели и т. д.
Использование макросов X восходит к 1960-м годам. Он остается полезным также в современных языках программирования C и C ++, но остается относительно неизвестным.
Макроприложение X состоит из двух частей:
Список определяется макросом или файлом заголовка (с именем LIST
), который сам по себе не генерирует код, а просто состоит из последовательности вызовов макроса (классически с именем «X
») с данными элементов. Каждому раскрытию LIST
предшествует определение X
с синтаксисом для элемента списка. Вызов LIST
расширяет X
для каждого элемента в списке.
В этом примере определяется список переменных и автоматически создаются их объявления и функция для их вывода.
Сначала определение списка. Записи списка могут содержать несколько аргументов, но здесь используется только имя переменной.
#define LIST_OF_VARIABLES \ X (value1) \ X (value2) \ X (value3)
Затем мы выполняем этот список для генерации объявлений переменных:
#define X (name) int name; LIST_OF_VARIABLES #undef X
Аналогичным образом мы можем сгенерировать функцию, которая печатает переменные и их имена:
void print_variables () {#define X (name) printf (#name "=% d \ n", название); LIST_OF_VARIABLES #undef X}
При запуске через препроцессор C генерируется следующий код. Для облегчения чтения были добавлены разрывы строк и отступы, хотя на самом деле они не генерируются препроцессором:
int value1; int value2; int value3; void print_variables () {printf ("значение1" "=% d \ n", значение1); printf ("значение2" "=% d \ n", значение2); printf ("значение3" "=% d \ n", значение3); }