Headerdateien - Definieren & Benutzung



  • Hi 😃

    hab mal mein ganzen buch durchstudiert,also nicht ganzes,aber halt fast das ganze *g*
    So nun komm ich zu so einem Problem.. ich weiss nicht,wie man mit headerdateien umgeht.Oft habe ich bei anderen den Code angeschaut,so das zbsp. void() nur so als Beispiel stand.Auch hab ich mich auf Tutorialseiten schlau gemacht.Doch leider ohne erfolg 😞

    1. Benutzung
    Was schreibe ich überhaupt in eine Headerdatei hinein?
    Wie benutze ich diese dann im genaueren?

    2. Intialisierung
    Oft hab ich hier im Forum gesehen,das viele wegen intialisierungen fragen,doch das mit ..

    class standart {
    public:
    
    private:
    int c;
    };
    standart(): c(12) {};
    

    .. weiss ich um erlich zu sein noch immer nicht 😮

    Naja das einzige,worüber ich mich freuen würde, ist dass das ich weiß wie man ein Profi beim Headerschreiben wird ^^

    Primer 😉



  • zunächst grundsätzliches:
    im technischen sinne existiert kein unterschied zwischen *.h (header) und *.cpp (implementation) dateien. man nutzt die verschiedenen bezeichner aus übersichtsgründen, denn in den headerdateien schreibt der geneigte c++er die funktionsprototypen (oder eben die von klassen)...

    anhand eines beispiels verstehst du es vielleicht besser:

    //myfunctions.h
    
    void anyFooFunction(int i,float f,double d);
    
    //end of myfunctions.h
    

    anhand einer datei, in welcher die main-funktion steht zeige ich mal wie man das benutzen würde:

    #include "myfunctions.h" //die " geben dem compiler einfach an, nach der    //headerdatei im lokalen verzeichnis des projektes zu suchen
    
    int main()
    {
    anyFooFunction(1,2.0f,2.0);
    return 0;
    }
    

    das würde jetzt so aber einen fehler beim kompilieren geben, da dem compiler noch nicht bekannt ist, was die funktion "anyFooFunction" eigentlich macht.

    deshalb nutzt man dann auch *.cpp dateien um die funktion zu implementieren, also sie umzusetzen:

    //myfunctions.cpp
    
    #include "myfunctions.h"
    
    void anyFooFunction(int i,float f,double d);
    {
    anyFooFunction(i,f,d); //"endlosschleife" da sich funktion selbst auruft 
                           //nennt man auch "rekursiv" :)
    }
    

    benutzt du eine ide wie z.B. eine beliebige visual studio edition, fügst du dateien deinem projekt ja wie kleine objekte hinzu. normalerweise nimmt der compiler alle dateien in den compiliervorgang auf und "geht drüber", sprich er erkennt, dass in myfunctions.cpp die definition für das aus .h steht

    im übrigen macht "#include" nichts anderes, als den inhalt der angegebenen datei einfach an die stelle im code zu setzen, an der es steht.. deswegen benutzt man bei headerdateien meistens einen "include" schutz

    der sieht so aus:

    //zeuch.h
    #ifndef HEADERNAMEWIEDUWILLST_H //"if not defined"
    #define HEADERNAMEWIEDUWILLST_H 
    
    void zeuch();
    
    #endif
    

    in einer anderen datei stünde dann

    #include "zeuch.h"
    
    int main()
    {
    return 0;
    }
    

    für den compiler steht dann da:

    void zeuch();
    
    int main()
    {
    return 0;
    }
    

    mfg, hab glaub ich nix vergessen



  • Und statt dem #ifndef, #define, #endif kann man bei den meisten Compilern auch einfach

    #pragma once
    

    schreiben. Das ist zwar KEIN Standard-C++, aber viele Compiler fressen es trotzdem.
    Guckst du hier: http://en.wikipedia.org/wiki/Pragma_once



  • Danke für die netten Antworten,vielen Dank 😉

    Also ich mache so als Beispiel mal zwei Dateien: 1Header und 1CPP..

    ///versuch.h
    #ifndef HEADERDATEI_H
    #define HEADERDATEI_H
    void mathe(int volt, float volumen, char garnichts);
    #endif
    
    ///main.cpp
    #include<iostream>
    #include<windows.h>
    using namespace std;
    
    #include "myfunctions.h"
    void mathe(int volt, float volumen, char garnichts);
    {
    mathe(2,12.5,'A'); 
    }
    

    Bei meinem kommen folgende Fehler:

    C:\Dokumente und Einstellungen\-\-\-\main.cpp:4:25: myfunctions.h: No such file or directory
    C:\Dokumente und Einstellungen\-\-\-\main.cpp:6: error: expected unqualified-id before '{' token
    C:\Dokumente und Einstellungen\-l\-\-\main.cpp:6: error: expected `,' or `;' before '{' token
    

    und bei deinem genau die gleichen 😕
    Auch bin ichm ir nicht sicher ob es einen Sinn hat,wenn man das void ..() in der Header und in der CPP definiert 😕

    Mfg. Primer
    P.S.: Danke trodzdem für alle nötige Erklärung 😉



  • Den Kommentaren in deinem Quelltext nach zu folgern heißt deine Headerdatei "versuch.h".

    Es ist nun wirklich kein Wunder, wenn der Compiler die Headerdatei "myfunctions.h" nicht findet, du die in "main.cpp" zu inkludieren versuchst.



  • "myfunctions.h" war nur ein von mir frei gewählter name.

    da du deine datei anscheinend "versuch.h" genannt hast, musst du diese auch #include -n und nicht "myfunctions.h"

    #include "versuch.h"
    

    funktionen aus headerdateien löst man übrigens im normalfall nicht in der "main-datei" auf (also man definiert sie nicht in dieser) sondern in einer externen, anderen cpp datei. bei dir wäre dass dann halt "versuch.cpp" in der stehen würde

    #include "versuch.h"
    
    void mathe(...)
    {
    ...
    }
    

    edit: ach ja, die anderen beiden fehler:

    void mathe(int volt, float volumen, char garnichts); //<------ semikolon (';') muss weg!!
    {
    mathe(2,12.5,'A');
    }
    


  • Danke euch beiden für die schnelle Antwort.
    Nur würde ich gerne noch eins wissen,bevor das Thema geklärt wurde:
    Wozu steht in der Header

    void mathe(int volt, float volumen, char garnichts);
    

    .. wenn es auch ohne geht?



  • das nennt man "standard" 🙂



  • TravisG schrieb:

    das nennt man "standard" 🙂

    sry,aber daraus werde ich nicht schlau 😃
    Ich hatte normalerweise danach gesucht,wie man das in Headerdateien machen kann und nicht in cpp's d.h man kann nur in den headern das machen,aber in cpp nicht :=)

    Und außerdem hätte ich geglaubt,dass man ..

    void funktion(float apple)
    {
    funktion(12)
    };
    

    das nur in die headerdatei schreiben muss und in cpp benutzen kann.
    Was würde so nach meinen Vorstellungen gehen?



  • Hallo

    lies dir ein Tutorial zum Thema Übersetzungseinheiten durch.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Hi 😉

    akari schrieb:

    lies dir ein Tutorial zum Thema Übersetzungseinheiten durch.

    Danke, ich werde es fleißig durcharbeiten 🕶

    akari schrieb:

    bis bald
    akari

    bis bald
    Primer

    P.S.: Ich will nur kurz nachmachen,soll ja auch nicht als "ÄRGERN" betrachtet werden,nur halt als dankeschön 😉

    Aber mal im Ernst: Danke 👍


Log in to reply