• #define: Определяет макрос.
    • Макрос-константа: Простая текстовая подстановка.
      #define BUFFER_SIZE 1024
      // ...
      char buffer[BUFFER_SIZE]; // Заменится на char buffer[1024];
    • Макрос-функция: Подстановка с параметрами. Важно использовать скобки!
      #define SQUARE(x) ((x)*(x)) // Правильно
      #define BAD_SQUARE(x) x*x   // Неправильно (проблемы с приоритетом)
      // ...
      int result = SQUARE(a + b); // Заменится на int result = ((a + b)*(a + b));
      • Преобразование в строку (#): Оператор # перед параметром макроса-функции преобразует аргумент в строковый литерал.
        #define PRINT_VAR(var) printf(#var " = %d\n", var)
        // ...
        int count = 10;
        PRINT_VAR(count); // Превратится в printf("count" " = %d\n", count); 
                          // Выведет: count = 10
      • Конкатенация токенов (##): Оператор ## “склеивает” два токена во время препроцессирования.
  • #undef: Отменяет определение макроса.
    #undef BUFFER_SIZE 
  • #include: Вставляет содержимое указанного файла в текущий файл.
    • #include <filename.h>: Поиск файла в стандартных системных каталогах.
    • #include "filename.h": Поиск файла сначала в текущем каталоге, затем в стандартных.
  • Директивы условной компиляции: Позволяют включать или исключать части кода из компиляции в зависимости от условий.
    • #if выражение: Если целочисленное выражение не равно 0.
    • #ifdef МАКРОС: Если МАКРОС был определен через #define.
    • #ifndef МАКРОС: Если МАКРОС не был определен.
    • #else: Альтернативный блок для #if, #ifdef, #ifndef.
    • #elif выражение: else if для препроцессора.
    • #elifdef МАКРОС: else ifdef.
    • #elifndef МАКРОС: else ifndef.
    • #endif: Завершает блок условной компиляции (#if, #ifdef, #ifndef).
    #define DEBUG_MODE 1
     
    #ifdef DEBUG_MODE
        printf("Debug message\n");
    #else
        printf("Release message\n");
    #endif 

〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰