0Pricing
C Academy · Lekcja

Stałe #define

Użyje Pan/Pani stałych preprocesora.

Stałe #define to bezpłatna lekcja C Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.

Działanie #define

#define to dyrektywa preprocesora, która tworzy makro — nazwę zastępowaną przez preprocesor tekstem przed kompilacją.

Makra są często używane do nadawania czytelnych nazw stałym wartościom, takim jak rozmiar bufora lub limit.

#define MAX_LEN 256

Podstawianie tekstu

Makro jest wyłącznie zamianą tekstu. W każdym miejscu, w którym występuje MAX_LEN, preprocesor wstawia zamiast niego 256.

Nie ma tu typu ani pamięci — wszystko dzieje się, zanim kompilator w ogóle zobaczy kod.

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

Bez średnika

Częstym błędem jest kończenie dyrektywy #define średnikiem.

Średnik staje się częścią tekstu zastępczego i może powodować trudne do zrozumienia błędy. Należy go pominąć.

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

Definiowanie stałej zmiennoprzecinkowej

Makra działają z każdym literałem, także z wartościami zmiennoprzecinkowymi.

W tym przykładzie PI jest podstawiane do wzoru na pole przy każdym użyciu.

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

Makra jako rozmiary tablic

Makra są często używane do określania rozmiaru tablic, ponieważ wartość musi być znana podczas kompilacji.

Użycie nazwy pozwala przechowywać rozmiar w jednym miejscu i łatwo go zmieniać.

#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;
}

Zawsze umieszczaj wyrażenia w nawiasach

Jeśli makro rozwija się do wyrażenia, należy ująć je w nawiasy.

Bez nawiasów priorytet operatorów może zmienić znaczenie wyrażenia, gdy makro zostanie użyte jako część większego wyrażenia.

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

Dlaczego nawiasy mają znaczenie

Ten program pokazuje różnicę. Z nawiasami WIDTH jest mnożone jako całość, a bez nich mnożona jest tylko jego część.

Bezpieczna wersja wypisuje 60, natomiast niebezpieczne rozwinięcie obliczyłoby inną wartość.

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

Makra tekstowe

Makra mogą również zastępować literały tekstowe, co jest przydatne w przypadku stałych komunikatów lub nazw wersji.

Tekst jest podstawiany dokładnie, łącznie z cudzysłowami.

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

#define a const

Makro nie ma typu ani adresu, natomiast zmienna const ma oba te elementy i podlega regułom zakresu.

Należy preferować const, gdy potrzebne są bezpieczeństwo typów i widoczność podczas debugowania. #define należy stosować do stałych znanych w czasie kompilacji, takich jak rozmiary tablic.

#define M_SIZE 10
const int c_size = 10;

Usuwanie definicji i strażniki

Makro można usunąć za pomocą #undef. Makra służą również do tworzenia strażników nagłówków, które zapobiegają wielokrotnemu dołączaniu pliku.

Pokazano tu klasyczny wzorzec strażnika używany na początku plików nagłówkowych.

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

Konwencja nazewnictwa

Zgodnie z wieloletnią konwencją nazwy makr zapisuje się wielkimi literami, używając podkreśleń.

Wizualnie wskazuje to, że są to stałe preprocesora, i pomaga uniknąć kolizji ze zwykłymi nazwami zmiennych.

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

Szybki test

Sprawdź swoją wiedzę o makrach.

Podsumowanie

#define tworzy makra, które preprocesor podstawia jako tekst — bez typu, średnika i zajmowania pamięci.

Wyrażenia należy ujmować w nawiasy, a do wartości wymagających bezpieczeństwa typów preferować const. Makra należy zachować do zastosowań wymagających wartości znanych podczas kompilacji, takich jak rozmiary tablic i strażniki nagłówków.

Często zadawane pytania

Czy lekcja „Stałe #define” jest bezpłatna?

Tak — pełny tekst „Stałe #define” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Stałe #define”?

Użyje Pan/Pani stałych preprocesora. Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C Academy?

Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Stałe #define”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?

Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Definiowanie enumów
  2. Wartości enumów i zakresy
  3. Zmienne const
  4. Stałe #define
← Powrót do C Academy