macros.md 1.6 KB

Макрос существуют только до компиляции . Это директива которую понимает только препроцессор. Они позволяют генерировать код перед компиляцией

  • определение константы
  • использование вместо обычной функции на С
  • разворачивание цикла
  • предотвращение дублирования заголовков
  • генерация кода
  • условная компиляция

    // Определение макроса
    #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__)