include Probleme



  • Hallo,
    ich habe da mal eine (sicher einfache) Frage. Ich habe mir ein c++ Programm geschrieben,

    welches einige Funktionen und viele Variablen enthält. Zur besseren übersicht, habe ich nun

    einige Funktionen in eine separate Datei kopiert und diese dann mit #include eingebunden.

    Nun erklärt mir der Compiler, dass bestimme Funktionen nicht gefunden werden...

    Bsp.:

    Dat1.cpp

    void test()
    {
    ...
    ...
    clrsrc();
    ...
    ...
    }
    

    Hauptprogramm.cpp

    #include "Dat1.cpp"
    #include <conio.h>
    
    void main()
    {
    ...
    ...
    clrsrc();
    ...
    test();
    ...
    }
    

    clrsrc(); ist in conio.h. Aber warum sagt der Compiler mir , dass clrscr ein Prototyp haben muss?



  • EDIT: Wenn Du (in Hauptprogramm.cpp) erst den nutzenden Code (Dat1.cpp) inkludierst und DANACH erst conio.h, weiß der Compiler noch nichts von "conio.h", wenn er zum clrscr() kommt (beim compile von Hauptprogramm.cpp).

    Diese Art der Inkludierung ist übriges nicht Sinn der Sache. Normalerweise macht man das (aus guten Gründen) so:

    // Dat1.h
    void test(); // Prototyp/Deklaration der Funktion test()
    
    // Dat1.cpp
    #include "Dat1.h" // Aus Konsistenzgründen
    
    #include <conio.h> // Erst und nur hier wird conio.h gebraucht
    void test() // implementierung der Funktion test().
    {
    ...
    ...
    clrsrc();
    ...
    ...
    }
    
    // Hauptprogramm.cpp
    #include "Dat1.h" // hier "importiere" ich den Prototypen von test()
    
    int main() 
    {
    ...
    ...
    clrsrc();
    ...
    test();
    ...
    }
    

    ach ja: main gibt IMMER int zurück - nie void.

    Gruß,

    Simon2.



  • Digga, du musst die Libraries schon da includieren, wo du sie brauchst!
    Das heisst, jede Library extra include, kannst aber auch einfach ne Header nehmen, da den ganzen Müll reinpacken und bei jeder .cpp-Datei den Header dann includieren.



  • @Simon2: Wie kann denn der Compiler die Datei Dat1.cpp finden, obwohl sie nirgends includet wird? Oder sucht der Compiler automatisch nach Dat1.cpp wenn es Dat1.h gibt?

    @Waygener: ich weis nicht so recht was du meinst...



  • Hojo schrieb:

    @Simon2: Wie kann denn der Compiler die Datei Dat1.cpp finden

    Genauso wie er die Datei Hauptprogramm.cpp findet - indem du sie ihm zeigst.



  • Der Compiler braucht zum Übersetzen deines Codes den Prototypen der zu benutzenden Funktionen. Daher inkludiert man diese wie hier bereits beschrieben. Erst der Linker benötigt dann wirklich alle Object-Dateien, um alle benötigten Symbole auflösen zu können und ein Executable bzw. eine lib oder Dll zu bauen.

    Schau einfach mal hier: http://de.wikipedia.org/wiki/Kompilieren

    Gruß Kimmi



  • Irgendwie versteh ich euch immer nocht net... 😞
    Wenn ich das Beispiel von Simon (also Hauptprogramm) kopilieren will, holt er sich dann automatisch Dat1.cpp?



  • Hojo schrieb:

    Irgendwie versteh ich euch immer nocht net... 😞
    Wenn ich das Beispiel von Simon (also Hauptprogramm) kopilieren will, holt er sich dann automatisch Dat1.cpp?

    Grob:

    Header sind das Inhaltsverzeichnis, die Sourcedateien (cpp) sind der eigentliche Text.

    Übersetzt werden die cpp-Dateien einzelnen. Dazu brauchen sie nur die Inhaltsverzeichnisse der anderen Dateien, da sie nur wissen müssen, wo sie zur Laufzeit nachschlagen müssen. Wurden alle übersetzt, fügt der Linker alle zusammen, um sicherzustellen das auch kein Nachschlagen ins Leere führt.

    Hört sich doof an, ist aber fast so. 😉



  • Hojo schrieb:

    Irgendwie versteh ich euch immer nocht net... 😞
    Wenn ich das Beispiel von Simon (also Hauptprogramm) kopilieren will, holt er sich dann automatisch Dat1.cpp?

    Welchen Compiler/welche IDE verwendest du denn? Wenn du zum Beispiel den g+ verwendest, dann kannst du das Beispiel von Simon mit

    g++ Dat1.cpp Hauptprogramm.cpp -o foo.exe
    

    kompilieren.

    Was Simon noch vergessen hat, sind die Include-Guards in der Header-Datei, die sollte so (oder ähnlich) aussehen:

    #ifndef DAT_1
    #define DAT_1
    
    // Dat1.h
    void test(); // Prototyp/Deklaration der Funktion test()
    
    #endif
    

    Den Namen (DAT_1) kannst du dir natürlich frei aussuchen. Das dient dazu, dass wenn man die Header-Datei zwei mal einbindet (kann durch Benutzung in verschiedenen Headern und auch so leicht passieren), sie nur einmal übersetzt wird, um damit redeclaration Fehlern vorzubeugen. Das ist bei dieser Header-Datei zwar nicht wichtig, weil man eine Funktion mehrmals deklarieren kann, aber bei Klassen geht das zum Beispiel nicht mehr.

    Felix


Anmelden zum Antworten