Макрос существуют только до компиляции . Это директива которую понимает только препроцессор. Они позволяют генерировать код перед компиляцией - определение константы - использование вместо обычной функции на С - разворачивание цикла - предотвращение дублирования заголовков - генерация кода - условная компиляция ```c // Определение макроса #define // Сделать макрос неопределенным #undef // Функциональный макрос #define ADD(a, b) a + b ``` ~={yellow}Операторы # и ## в макросах=~ - Оператор # переводит параметр в строковую форму - Оператор ## соединяет параметры с другими элементами макроса. Обычно для формирования имен переменных. ```c #define CMD(name) \ char NAME ## _cmd[256] = ""; \ strcpy(NAME ## _cmd, #NAME); CMD(copy) CMD(paste) CMD(cut) // Макрос CMD будет развернут в ... char copy_cmd[256] = ""; strcpy(copy_cmd, "copy"); char copy_cmd[256] = ""; strcpy(paste_cmd, "copy"); char copy_cmd[256] = ""; strcpy(cut_cmd, "copy"); ``` ~={yellow}Макросы с переменным количеством аргументов=~ ```c #define LOG_ERROR(format, ...) \ fprintf(stderr, format, __VA_ARGS__) ```