Zdarzyło się Wam podczas programowania załączyć w dwóch miejscach projektu ten sam plik nagłówkowy? Być może jego włączenie było w danym miejscu konieczne przy pewnej funkcjonalności, ale przy innej już nie?

Mam na to krótki TIP dla Tych z Was, którzy takie błędy popełniają dość często. Za razem pozwoli Wam to na przygotowanie uniwersalnego nagłówka, który będziecie mogli wykorzystać w wielu projektach na raz bez potrzeby zamartwiania się o re-deklaracje klas oraz funkcji.

#ifndef KLASA_TESTOWA_H
#define KLASA_TESTOWA_H

class klasa_testowa {
public:
klasa_testowa() {}
int funkcja_testowa();
};

int klasa_testowa::funkcja_testowa() {
return 0;
}

#endif  // KLASA_TESTOWA_H

Dyrektywa #ifndef

Jest to specjalna dyrektywa informująca kompilator, że w przypadku nie znalezienia określonej definicji ma włączyć kod zawarty w warunku IF do projektu. Jak się to odbywa?

Załóżmy, że mamy naszą prostą klasę, znajdującą się w pliku nagłówkowym „klasa_test.h”. Wygląda ona następująco:

class klasa_testowa {
public:
klasa_testowa() {}
int funkcja_testowa();
};

int klasa_testowa::funkcja_testowa() {
return 0;
}

Jeśli wykorzystamy załadujemy w jednym projekcie nagłówek „klasa_test.h” bardzo możliwe jest, że otrzymamy komunikat o redeklaracji klasy. Aby uniknąć takich nieporozumień wykorzystujemy dyrektywę #ifndef w następujący sposób.

#ifndef KLASA_TESTOWA_H
#define KLASA_TESTOWA_H

 

 

class klasa_testowa {
public:
klasa_testowa() {}
int funkcja_testowa();
};

 

 

int klasa_testowa::funkcja_testowa() {
return 0;
}

 

#endif // KLASA_TESTOWA_H

Jak widzimy, klasa została otoczona dyrektywą #ifndef i zamknięta poprzez #endif. Spowoduje to automatyczne, że nawet tak banalny błąd:

#include <iostream>

#include "test.h"
#include "test.h"

using namespace std;

int main()
{
klasa_testowa* test = new klasa_testowa();
return test->funkcja_testowa();
}

Przejdzie nam płazem podczas kompilacji a nasza klasa zostanie załączona tylko 1 raz.

 

Mam nadzieję, że powyższy TIP Wam się przyda. Jeśli znacie jeszcze inne tego typu rozwiązania, zapraszam do komentowania wpisu poniżej.

Pozdrawiam, M.M.