Макрос существуют только до компиляции . Это директива которую понимает только препроцессор. Они позволяют генерировать код перед компиляцией
условная компиляция
// Определение макроса
#define
// Сделать макрос неопределенным
#undef
// Функциональный макрос
#define ADD(a, b) a + b
~={yellow}Операторы # и ## в макросах=~
Оператор ## соединяет параметры с другими элементами макроса. Обычно для формирования имен переменных.
#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}Макросы с переменным количеством аргументов=~
#define LOG_ERROR(format, ...) \
fprintf(stderr, format, __VA_ARGS__)