Zabezpieczenia przed wielokrotnym dołączeniem
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 2 z 61.
Gdy plik nagłówkowy zostaje dołączony do projektu wiele razy, kompilator wielokrotnie widzi te same deklaracje, co powoduje błędy. Zdarza się to często, gdy wiele plików dołącza ten sam plik nagłówkowy lub gdy pliki nagłówkowe dołączają się nawzajem. Strażniki dołączania rozwiązują ten problem.
Osłona dołączania używa trzech dyrektyw preprocesora, aby zagwarantować, że zawartość pliku nagłówkowego zostanie przetworzona tylko raz:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
Oto jak to działa: #ifndef MATH_UTILS_H sprawdza, czy symbol MATH_UTILS_H nie został jeszcze zdefiniowany. Jeśli nie, preprocesor kontynuuje działanie i natychmiast definiuje go za pomocą #define MATH_UTILS_H. Wszystko między tym punktem a #endif zostaje uwzględnione podczas kompilacji.
Gdy ten plik nagłówkowy jest dołączany po raz drugi, MATH_UTILS_H jest już zdefiniowany, więc cały blok zostaje pominięty. Nazwa strażnika to zazwyczaj nazwa pliku zapisana wielkimi literami, z kropkami i znakami specjalnymi zastąpionymi podkreśleniami.
Każdy utworzony przez Ciebie plik nagłówkowy powinien mieć strażniki dołączania. To standardowa praktyka, która zapobiega błędom kompilacji i sprawia, że kod można bezpiecznie dołączać w dowolnym miejscu projektu.
Wyzwanie
ŁatwyZabezpieczmy plik nagłówkowy przed wielokrotnym dołączeniem, dodając strażników dołączenia. Rozbudujesz narzędzie do powitań z poprzedniej lekcji, ale tym razem zadbasz o to, by plik nagłówkowy można było bezpiecznie dołączać wielokrotnie.
Utworzysz dwa pliki:
greet.h: Plik nagłówkowy zawierający deklarację funkcjigreet. Tym razem obejmij całą jego zawartość strażnikami dołączenia, używając symboluGREET_H.main.c: Główny plik, który dołącza plik nagłówkowy, implementuje funkcjęgreeti wywołuje ją zmain().
Funkcja greet powinna przyjmować parametr const char* reprezentujący imię i wypisywać:
Hello, Alice!Twój plik nagłówkowy powinien mieć następującą strukturę:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endifOtrzymasz jedną wartość wejściową: imię (ciąg znaków).
Wypisz powitanie dokładnie w formacie pokazanym powyżej, zastępując Alice podanym imieniem.
Spróbuj swoich sił
#include <stdio.h>
#include "greet.h"
// TODO: Zaimplementuj funkcję greet, która wypisuje "Hello, <name>!"
int main() {
char name[100];
scanf("%s", name);
// TODO: Wywołaj funkcję greet z argumentem name
return 0;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania modularnego
Pliki nagłówkoweZabezpieczenia przed wielokrotnym dołączeniemPliki źródłoweFunkcje statycznePodsumowanie: kalkulator modularny4Enkapsulacja
Koncepcja niejawnych wskaźnikówDefiniowanie niejawnych strukturGettery i setteryWalidacja w setterachPowtórka: tajemnicze pudełko2Obiekty i metody
Struktury jako obiektyWskaźnik „self”Poprawność constWskaźnik czy wartośćMetody pomocniczePodsumowanie: menedżer punktów5Projekt: Proste konto bankowe
Konfiguracja projektuImplementacja konta8Polimorfizm
Wskaźniki do funkcji w strukturachSymulowanie metodKoncepcja interfejsuImplementowanie interfejsówIteracja polimorficznaPodsumowanie: Greeter11Wzorce projektowe w C
Wzorzec SingletonWzorzec fabrykiWzorzec iteratoraPodsumowanie: fabryka loggera3Cykl życia obiektu
Wzorzec konstruktoraWzorzec destruktoraInicjalizacja na stosieKopia głębokaPodsumowanie: klasa opakowująca ciąg znaków6Dziedziczenie przez kompozycję
Osadzanie strukturZasada pierwszego elementuDostęp do elementów klasy nadrzędnejKonwersja w górę hierarchiiPodsumowanie: hierarchia kształtów9Projekt: Rysownik kształtów
Przegląd projektuImplementacja kołaImplementacja prostokątaZastosowanie polimorfizmuKontener kształtówPoćwicz samodzielnie: Kompilator C online