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 wielokrotnie w projekcie, kompilator wielokrotnie widzi te same deklaracje, co powoduje błędy. Często zdarza się to, 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 nagłówka używa trzech dyrektyw preprocesora, aby zawartość pliku nagłówkowego była przetwarzana 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 został, preprocesor kontynuuje działanie i natychmiast definiuje go za pomocą #define MATH_UTILS_H. Wszystko między tym miejscem a #endif jest uwzględniane podczas kompilacji.
Gdy ten nagłówek jest dołączany po raz drugi, MATH_UTILS_H jest już zdefiniowane, więc cały blok zostaje pominięty. Nazwa zabezpieczenia jest zwykle nazwą pliku zapisaną wielkimi literami, z podkreśleniami zamiast kropek i znaków specjalnych.
Każdy tworzony przez Ciebie plik nagłówkowy powinien mieć strażników dołączania. To standardowa praktyka, która zapobiega błędom kompilacji i sprawia, że Twój kod można bezpiecznie dołączać z dowolnego miejsca w projekcie.
Wyzwanie
ŁatwyZabezpieczmy plik nagłówkowy przed wielokrotnym dołączaniem, dodając strażniki dołączania. Rozbudujesz narzędzie do witania z poprzedniej lekcji, ale tym razem zadbasz o to, aby plik nagłówkowy można było bezpiecznie dołączać wielokrotnie.
Utworzysz dwa pliki:
greet.h: Twój plik nagłówkowy zawierający deklarację funkcjigreet. Tym razem ujmij całą jego zawartość w strażniki dołączania, używając symboluGREET_H.main.c: Twój główny plik, który dołącza plik nagłówkowy, implementuje funkcjęgreeti wywołuje ją zmain().
Funkcja greet powinna przyjmować parametr const char* z imieniem 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 jedno wejście: imię (ciąg znaków).
Wypisz wiadomość powitalną 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 imieniem
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