Константы #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 — локальная установка не требуется.