piątek, 26 marca 2021

C - Header guard

W tym poście chciałbym opisać sposób wykorzystywania tzw. Header guard w języku C. 

[Źródło: https://icons.com/icon/40670/c-programming]

Głównym zadaniem takiego zabezpieczenia jest niedopuszczenie do występowania zduplikowanych definicji, funkcji itp itd. 

Podstawowy sposób wygląda następująco:

  1. #ifndef PRZYKLADOWA_NAZWA
  2. #define PRZYKLADOWA_NAZWA
  3.  
  4. //...
  5. //...
  6. //...
  7.  
  8. #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:

  1. #define __NAZWA_PLIKU_H_
  2. #define __FOLDER_NAZWA_PLIKU_H_
  3. #define __INC_FOLDER_NAZWA_PLIKU_H_
  4. //lub może też być
  5. #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:

  1. #ifndef VALUE_TEST
  2. #define VALUE 50
  3. #endif
  4.  
  5. #ifdef LCD_DISPLAY
  6. #define JPG_DISPLAY
  7. #define FONT_5_7
  8. #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:

  1. #pragma once
  2.  
  3. //...
  4. //...
  5. //...

Jeśli chcemy zapewnić maksymalną możliwość przenoszenia części programu jaki został napisany to najlepszym rozwiązaniem będzie wykorzystanie pierwszego rozwiązania.