wie schreibt man include guards???



  • Hallo, ich hab eine kleine Aufgabe aus einem Buch mal versucht etwas zu bearbeiten.
    Allerdings habe ich nun das Problem, dass zwei Dateien einen Header inkludieren. Dann hab ich mal bei google gesucht, hab auch was gefunden zu den include guards habe es dann ausprobiert, aber es funktioniert nicht:

    //header file Stack.h
    #define STACK_H
    int const maxStack=16;
    
    class IStack
    {
    public:
    	IStack():_top(0){}
    	void Push(int i);
    	int Pop();
    private:
    	int _array[maxStack];
    	int _top;
    };
    
    //source file Stack.cpp
    #include <cassert>
    #if !defined STACH_H//muss natürlich #if !defined STACK_H heissen
    #include "Stack.h"
    
    void IStack::Push(int i)
    {
    	assert(_top<maxStack);
    	_array[_top]=i;
    	++_top;
    }
    int IStack::Pop()
    {
    	assert(_top>0);
    	--_top;
    	return _array[_top];
    }
    
    #endif
    
    //source file main.cpp
    #include <cassert>
    #if !defined STACH_H//ebenfalls STACK_H
    #include "Stack.h"
    
    void IStack::Push(int i)
    {
    	assert(_top<maxStack);
    	_array[_top]=i;
    	++_top;
    }
    int IStack::Pop()
    {
    	assert(_top>0);
    	--_top;
    	return _array[_top];
    }
    #endif
    

    Und nun wie immer die Frage woran liegt es?
    (Die Forensuche hat keine entsprechenden Beiträge gefunden)



  • #ifndef TRALALA_H
    #define TRALALA_H
    //hier den inhalt des headers reinpacken
    #endif
    


  • bei msvc++ und neuerdings auch beim g++ funzt auch (iirc):

    #pragma once
    
    // code
    


  • terraner schrieb:

    bei msvc++ und neuerdings auch beim g++ funzt auch (iirc):

    #pragma once
    
    // code
    

    man sollte das aber IMHO nur zusätzlich benutzen. Da pragma Compilerabhängig ist und sonst einfach ignoriert wird.



  • Also erst mal danke für eure Antworten.
    Habe aber leider noch eine Frage:
    Die Theorie hinter den include guards ist doch dass man eine Konstante oder einen "Ausdruck" mittels #define definiert und dann jeweils vor dem inkludieren guckt ob die Konstante dem ?Linker/Präprozessor? schon bekannt ist.
    und nun die eigentlich Frage:

    Windalf schrieb:

    #ifndef TRALALA_H
    /*Im header zu gucken ob TRALALA_H schon definiert ist ist doch Unsinn da dies erst in der nächsten Zeile geschieht, oder?
    (kann man auch das #endif weglassen ?)*/
    #define TRALALA_H
    ...
    #endif
    

    (Das hatte ich auch schon mal so aber es hat trotzdem nicht funktioniert. 😞 )
    Jomi



  • Jomi schrieb:

    #ifndef TRALALA_H
    /*Im header zu gucken ob TRALALA_H schon definiert ist ist doch Unsinn da dies erst in der nächsten Zeile geschieht, oder?
    (kann man auch das #endif weglassen ?)*/
    #define TRALALA_H
    ...
    #endif
    

    Falls ich deine Frage richtig verstanden haben sollte: #ifndef-umschlossener Code wird nur ausgeführt, wenn das angegebene Makro nicht existiert. Zu den umschlossenen Befehlen gehört dann eben die Definition des Makros, so daß der Test beim zweiten Includen fehlschlägt.
    Das #endif kann man nicht weglassen.

    Moritz


Anmelden zum Antworten