W tym poście chciałbym opisać sposób wykorzystywania tzw. Header guard w języku C.
Głównym zadaniem takiego zabezpieczenia jest niedopuszczenie do występowania zduplikowanych definicji, funkcji itp itd.
Podstawowy sposób wygląda następująco:
- #ifndef PRZYKLADOWA_NAZWA
- #define PRZYKLADOWA_NAZWA
- //...
- //...
- //...
- #endif /* PRZYKLADOWA_NAZWA */
Powyższa deklaracja sprawdza czy dane makro zostało już zdefiniowane, jeśli nie to następuje zdefiniowane pliku. W przypadku braku #ifndef plik może zostać dodany do projektu więcej niż raz. Co spowoduje wygenerowanie błędów.
Najczęściej nazwy plików wyglądają mniej więcej tak:
- #define __NAZWA_PLIKU_H_
- #define __FOLDER_NAZWA_PLIKU_H_
- #define __INC_FOLDER_NAZWA_PLIKU_H_
- //lub może też być
- #define __JAKAS_INDYWIDUALNA_NAZWA_
Takie rozwiązanie można też stosować np. do definiowanie wartości w programie lub specjalnych opcji które chcemy włączyć podczas zmian w preprocesorze:
- #ifndef VALUE_TEST
- #define VALUE 50
- #endif
- #ifdef LCD_DISPLAY
- #define JPG_DISPLAY
- #define FONT_5_7
- #endif
Powyżej też jeden przykład sprawdzający czy jakaś definicja została już zawarta w plikach.
Można też wykorzystać prostszą formę. Większość kompilatorów wspiera takie rozwiązania. Natomiast nie jest to oficjalnie umieszczone w standardzie:
- #pragma once
- //...
- //...
- //...
Jeśli chcemy zapewnić maksymalną możliwość przenoszenia części programu jaki został napisany to najlepszym rozwiązaniem będzie wykorzystanie pierwszego rozwiązania.