0Pricing
C Academy · Урок

Константы #define

Используйте константы препроцессора.

«Константы #define» — бесплатный урок C Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.

Что делает #define

#define — это директива препроцессора, создающая макрос: имя, которое препроцессор заменяет текстом до компиляции.

Обычно его используют, чтобы дать понятное имя фиксированному значению, например размеру буфера или ограничению.

#define MAX_LEN 256

Текстовая подстановка

Макрос выполняет простую замену текста. Везде, где встречается MAX_LEN, препроцессор подставляет вместо него 256.

Здесь нет ни типа, ни памяти: подстановка происходит ещё до того, как компилятор увидит код.

#include <stdio.h>
#define MAX_LEN 256
int main(void) {
    printf("%d\n", MAX_LEN);
    return 0;
}

Без точки с запятой

Распространённая ошибка — завершать #define точкой с запятой.

Точка с запятой становится частью подставляемого текста и может привести к непонятным ошибкам. Не ставьте её.

#define PI 3.14159     /* correct */
#define BAD 10;        /* wrong: semicolon is substituted too */

Определение константы с плавающей точкой

Макросы работают с любыми литералами, включая значения с плавающей точкой.

Здесь PI подставляется в формулу площади при каждом использовании.

#include <stdio.h>
#define PI 3.14159
int main(void) {
    double r = 2.0;
    printf("%.2f\n", PI * r * r);
    return 0;
}

Макросы для размеров массивов

Макросы часто используют для задания размеров массивов, поскольку значение должно быть известно во время компиляции.

Имя хранит размер в одном месте, где его легко изменить.

#include <stdio.h>
#define SIZE 5
int main(void) {
    int data[SIZE] = {1, 2, 3, 4, 5};
    printf("%d\n", data[SIZE - 1]);
    return 0;
}

Всегда заключайте выражения в скобки

Если макрос раскрывается в выражение, заключайте его в скобки.

Без скобок приоритет операторов может изменить смысл макроса, когда он используется внутри более крупного выражения.

#define WIDTH (4 + 2)   /* good */
#define BADW 4 + 2       /* risky: 10 * BADW becomes 10*4+2 */

Почему важны скобки

Эта программа показывает разницу. Со скобками WIDTH умножается целиком, а без них умножается только его часть.

Безопасный вариант выводит 60, а небезопасное раскрытие вычислило бы другое значение.

#include <stdio.h>
#define WIDTH (4 + 2)
int main(void) {
    printf("%d\n", 10 * WIDTH);
    return 0;
}

Строковые макросы

Макросы также могут обозначать строковые литералы, что удобно для фиксированных сообщений или названий версий.

Текст подставляется без изменений, включая кавычки.

#include <stdio.h>
#define APP_NAME "CoddyKit"
int main(void) {
    printf("Welcome to %s\n", APP_NAME);
    return 0;
}

#define и const

У макроса нет типа и адреса, а у переменной const есть и то и другое, и она подчиняется правилам области видимости.

Предпочитайте const, когда нужны безопасность типов и удобство отладки. Используйте #define для констант времени компиляции, например размеров массивов.

#define M_SIZE 10
const int c_size = 10;

Отмена определения и защитные конструкции

Удалить макрос можно с помощью #undef. Макросы также лежат в основе защитных конструкций заголовочных файлов, предотвращающих повторное включение.

Здесь показан классический шаблон защиты, используемый в начале заголовочных файлов.

#ifndef CONFIG_H
#define CONFIG_H
/* header contents here */
#endif

Соглашения об именовании

По давней традиции имена макросов записывают в формате UPPER_CASE.

Так их визуально отличают от констант препроцессора и не путают с обычными именами переменных.

#include <stdio.h>
#define BUFFER_SIZE 1024
int main(void) {
    printf("%d\n", BUFFER_SIZE);
    return 0;
}

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете макросы.

Итоги

#define создаёт макросы, которые препроцессор подставляет как текст; у них нет типа, точки с запятой и памяти.

Заключайте выражения в скобки и предпочитайте const для типобезопасных значений, оставляя макросы для задач времени компиляции, таких как размеры массивов и защитные конструкции заголовочных файлов.

Часто задаваемые вопросы

Урок «Константы #define» бесплатный?

Да — полный текст урока «Константы #define» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.

Чему я научусь в уроке «Константы #define»?

Используйте константы препроцессора. Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C Academy?

Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Константы #define»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C Academy?

Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение перечислений
  2. Значения перечислений и диапазоны
  3. Переменные const
  4. Константы #define
← Назад к C Academy