Jak działa strażnik nagłówka ifndef?

0

Chciałem spytać jak działa strażnik nagłówka.

Tworzę plik nagłówkowy plik.h , a w nim są takie linijki:

 #ifndef PLIK_H
#definde PLIK_H

Czyli jeśli nie ma pliku nagłówkowego o nazwie plik.h to go tworzy , bo przecież już stworzyłem plik nagłówkowy plik.h i nie bardzo to rozumiem.

3
#ifndef PLIK_H
    #define PLIK_H
    <cala zawartosc pliku>
#endif

Żeby ułatwić zrozumienie zrobiłem wcięcie, którego normalnie się nie robi. PLIK_H to tylko jakaś nazwa, równie dobrze może to być DOOPA_JEZA_H. Jeśli ta nazwa nie została zdefiniowana (czyli pierwszy raz inkludujesz plik) to definiujesz tę nazwę i dołączasz całą zawartość pliku. Jeśli drugi raz inkludujesz to ta nazwa już została zdefiniowana, więc nie wykona się to co jest wcięte, czyli de facto inkludujesz pusty plik.

2

Co?

#ifndef PLIK_H // Jezeli makro PLIK_H nie jest zdefiniowane.
#define #PLIK_H // Zdefiniuj makro PLIK_H.
//...
#endif

I potem jak zrobisz:

// Nie ma makra PLIK_H.
#include "plik.h"
// Teraz jest juz makro PLIK_H.
#include "plik.h" // `ifndef` i wszystko pod nim się nie wykona bo już raz dodano plik.

Zapomnij o tym wynalazku. Używaj #pragma once na początku pliku nagłówkowego. Efekt jest taki sam a nie trzeba tyle pisać i dokładnie wiadomo do czego do służy - do zablokowania wielokrotnego includowania pliku nagłówkowego.

0

aha czyli plik nagłówkowy może nazywać się pliczek.h , a z

#ifndef PLIK_H
    #define PLIK_H 

nie ma nic wspólnego ? Tylko te linijki kodu dotyczą zawartości pliku ? Plik nagłówkowy zawsze musi mieć define na początku ? Bo inaczej to te linijki nie mają sensu.

Dobra już chyba rozumiem.

0

Poprawnie:

// plik.h

#ifndef PLIK_H
#define PLIK_H
    <cala zawartosc pliku>
#endif

// plik.cpp

#include "plik.h"

// tutaj, jeśli inny wciągany plik będzie zawierał "plik.h" to już go drugi raz nie wciągnie (czyli dobrze)

Instrukcje typu "#define" najlepiej zaczynać od pierwszej kolumny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1