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 256Podstawianie 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 */
#endifKonwencja 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.