Preprocessor, const, static, and enum · Предпроцессор, const, static и enum
What runs before the compiler
- Before the compiler sees your code, the preprocessor handles every line that starts with
#. - It pastes in headers, replaces macros, and removes comments — a simple text step.
- You have used it already:
#include <stdio.h>is a preprocessor command.
Что происходит до компилятора
- Перед тем как компилятор увидит ваш код, предпроцессор обрабатывает каждую строку, начинающуюся со
#. - Он вставляет заголовки, заменяет макросы и удаляет комментарии — это простой текстовый шаг.
- Вы уже использовали это:
#include <stdio.h>является командой препроцессора.
#include and #define
#include <stdio.h>pastes the contents of a header so you can use its functions.#define PI 3.14159makesPIa macro: the preprocessor replaces everyPIwith that text.- Macros have no type and no semicolon — they are pure text replacement.
#include и #define
#include <stdio.h>подключает содержимое заголовочного файла, чтобы вы могли использовать его функции.#define PI 3.14159делаетPIмакросом: препроцессор заменяет каждое вхождениеPIна этот текст.- У макросов нет типов и точек с запятой — это чистая замена текста.
const vs #define
const double pi = 3.14159;is a real variable that cannot be changed. It has a type, so the compiler checks it.#define PI 3.14159is just text replacement, done before compiling.- Modern C usually prefers
constfor values, but#defineis still common for constants and flags.
const vs #define
const double pi = 3.14159;— это реальная переменная, значение которой нельзя изменить. У неё есть тип, поэтому компилятор проверяет её корректность.#define PI 3.14159— это просто текстовая подстановка, выполняемая до этапа компиляции.- В современном C обычно предпочитают использовать
constдля значений, но#defineпо-прежнему часто применяется для констант и флагов.
static and enum
- A
staticvariable inside a function keeps its value between calls — it is set up once, not reset every time the function runs. - An
enumgives names to a set of relatedintvalues:enum Suit { HEARTS, DIAMONDS, CLUBS, SPADES };(hereHEARTSis0). - Both make code clearer:
staticfor memory that persists,enumfor named choices.
static и enum
- Переменная
staticвнутри функции сохраняет своё значение между вызовами — она инициализируется один раз, а не сбрасывается при каждом запуске функции. - Конструкция
enumприсваивает имена набору связанныхintзначений:enum Suit { HEARTS, DIAMONDS, CLUBS, SPADES };(здесьHEARTSявляется0). - Оба подхода делают код более понятным:
staticиспользуется для памяти, сохраняющей состояние, аenum— для именованных вариантов выбора.
#include <stdio.h>
#define GREETING "Hello"
enum Color { RED, GREEN, BLUE };
int main(void) {
printf("%s\n", GREETING); // Hello
enum Color c = GREEN;
printf("%d\n", c); // 1
return 0;
}
Common mistakes
#definedoes plain text replacement — wrap macro bodies in parentheses.constcannot change; astaticlocal keeps its value between calls.
Распространенные ошибки
#defineвыполняет простую текстовую подстановку — оборачивайте тела макросов в скобки.- Значение константы
constнеизменно; локальная переменная со статусомstaticсохраняет своё значение между вызовами.
Now you try
- Use the given
#defineandenumin the starters. - A
staticlocal variable remembers its value across calls. Do not write amain— the checker provides one.
Теперь попробуйте сами
- Используйте данные
#defineиenumв стартовых шаблонах кода. - Локальная переменная с модификатором
staticзапоминает своё значение между вызовами. Не пишитеmainсамостоятельно — проверка предоставит его сама.
The enum Suit { HEARTS, DIAMONDS, CLUBS, SPADES } is given. Complete const char *suit_name(enum Suit s) so it returns the name ("Hearts", "Diamonds", "Clubs", "Spades") using a switch. Do not write a main. · Дано enum Suit { HEARTS, DIAMONDS, CLUBS, SPADES }. Заполните const char *suit_name(enum Suit s) так, чтобы оно возвращало имя ("Hearts", "Diamonds", "Clubs", "Spades"), используя switch. Не пишите не main.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.
A macro #define PI 3.14159265358979 is given. Complete double circle_area(double r) so it returns the area of a circle, PI * r * r, using the macro. Do not write a main. · Дан макрос #define PI 3.14159265358979. Заполните double circle_area(double r) так, чтобы он возвращал площадь круга, PI * r * r, используя этот макрос. Не пишите не main.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.
Complete int next_id(void) using a static local counter, so the first call returns 1, the next 2, then 3, and so on. Do not write a main. · Заполните int next_id(void), используя локальный счётчик static, так, чтобы первый вызов возвращал 1, следующий — 2, затем 3 и так далее. Не пишите не main.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.