Zwei werte ausgeben



  • Möchte zwei werte ausgeben. Dazu habe ich folgendes geschrieben.

    Die my.h:

    extern int foo;
    void print_foo();
    void print(int);
    

    Dann eine my.cpp:

    #include "stdafx.h"
    #include "my.h"
    #include "std_lib_facilities.h"
    
    void print_foo(){
    	cout << foo << '\n';
    }
    
    void print(int i){
        cout << i << '\n';
    }
    

    Und die Hauptdatei use.cpp:

    #include "my.h"
    #include "stdafx.h"
    #include "my.cpp"
    
    int main()
    {
        foo = 7;
    	print_foo();
    	print(99);
    	char cc;
    	cin >> cc;
    	keep_window_open();
        return 0;
    }
    

    Ich will das der Wert von foo mit print_foo() ausgegeben wird und mit print() den Wert 99 auch ausgegeben wird. Der Compiler sagt immer das etwas mit print_foo() nicht stimmt.



  • winux schrieb:

    Der Compiler sagt immer das etwas mit print_foo() nicht stimmt.

    es ist wahrscheinlich eher der Linker der da spricht: "unresolved external symbol "int foo"

    es fehlt ein

    int foo;
    

    in Zeile 4 von my.cpp



  • Habe folgende Compiler Fehler:

    Fehler 8 error LNK2001: Nicht aufgelöstes externes Symbol ""int foo" (?foo@@3HA)". my.obj
    Fehler 9 error LNK2001: Nicht aufgelöstes externes Symbol ""int foo" (?foo@@3HA)". use.obj
    Fehler 5 error LNK2005: "void __cdecl print(int)" (?print@@$$FYAXH@Z) ist bereits in my.obj definiert. use.obj
    Fehler 3 error LNK2005: "void __cdecl print(int)" (?print@@YAXH@Z) ist bereits in my.obj definiert. use.obj
    Fehler 4 error LNK2005: "void __cdecl print_foo(void)" (?print_foo@@$$FYAXXZ) ist bereits in my.obj definiert. use.obj
    Fehler 2 error LNK2005: "void __cdecl print_foo(void)" (?print_foo@@YAXXZ) ist bereits in my.obj definiert. use.obj
    Fehler 7 error LNK2020: Nicht aufgelöstes Token (0A000389) "int foo" (?foo@@3HA). my.obj
    Fehler 6 error LNK2020: Nicht aufgelöstes Token (0A00038A) "int foo" (?foo@@3HA). use.obj
    Fehler 10 fatal error LNK1120: 3 nicht aufgelöste externe Verweise. C:\Users\CMTest\Documents\Visual Studio 2008\Projects\My H\Debug\My H.exe



  • Und kein cpp includen!



  • extern int foo;
    

    Wo hast du denn foo definiert?

    #include "my.cpp"
    

    Falsch, cpp-Dateien werden fuer gewoehnlich nicht inkludiert.



  • foo wurde in my.h definiert. Wenn ich die my.cpp nicht in use.cpp inkludiere dann bekomme ich Fehlermeldung wie der Compiler weist nicht was cin und cout ist. Oder wie füge ich use.cpp und my.cpp zusammen?


  • Mod

    winux schrieb:

    Oder wie füge ich use.cpp und my.cpp zusammen?

    Das macht nach dem Compilieren der Linker. Wie genau, das hängt von deinem Compiler bzw. deiner Entwicklungsumgebung ab. Wie rufst du denn derzeit den Compiler auf? Die meisten Compiler rufen auch gleich noch einen Linker auf und wenn man mehrere Quelltextdateien gleichzeitig angibt, dann werden sie auch automatisch zusammengelinkt.



  • Ganz dumme Frage, aber hast du es schon einmal mit

    #include <iostream>
    

    versucht???



  • Ich benutze Visual Studio 2008 mit der Standard Einstellungen. Aber es will irgendwie die zwei cpp Daten nicht zusammen bringen. Wenn es ginge dann würde ich keine Fehlermeldungen erhalten wie was ist ein cin oder cout. Der iostream ist schon in der std_lib_facilities.h definiert der wiederum in die my.cpp inkludiert ist nun muss nur use.cpp die my.cpp lesen und schon weiß es was der iostream ist, aber genau da ist das Problem.



  • Lass mal #include "my.cpp" weg!



  • Hab ich gemacht.



  • Komisch ist das ich die #include "my.cpp" weg gelassen haben, und die use.cpp sieht die my.cpp (wenn ich unter use.cpp mit der Maus auf foo gehe kommt ein kleines Fenster das sagt das es ein int ist) aber ich bekomme folgende Compiler Meldungen:

    Fehler 5 error C2065: 'cin': nichtdeklarierter Bezeichner c:\Users\CMTest\Documents\Visual Studio 2008\Projects\My H\use.cpp 12
    Fehler 2 error C2065: 'foo': nichtdeklarierter Bezeichner c:\Users\CMTest\Documents\Visual Studio 2008\Projects\My H\use.cpp 8
    Fehler 6 error C3861: "keep_window_open": Bezeichner wurde nicht gefunden. c:\Users\CMTest\Documents\Visual Studio 2008\Projects\My H\use.cpp 13
    Fehler 4 error C3861: "print": Bezeichner wurde nicht gefunden. c:\Users\CMTest\Documents\Visual Studio 2008\Projects\My H\use.cpp 10
    Fehler 3 error C3861: "print_foo": Bezeichner wurde nicht gefunden. c:\Users\CMTest\Documents\Visual Studio 2008\Projects\My H\use.cpp 9

    Warnung 1 warning C4627: "#include "my.h"": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen. c:\Users\CMTest\Documents\Visual Studio 2008\Projects\My H\use.cpp 3



  • Schreib in beide Datein am besten noch

    #include <iostream>
    

    Das dürfte dein Problem lösen!!!



  • Habe die my.h nach stdafx.h geschrieben und jetzt ist die Warnung weg. Mit dem #include <iostream> werde ich noch hinschreiben. Aber jetzt mal eine Frage was bedeutet das : Beachten Sie, dass use.cpp nicht die Headerdatei std_lib_facilities.h einbindet, da sie ihre Elemente direkt verwendet?



  • Ich glaube, das heißt, dass die Datei schon eingebunden ist!



  • Kleiner Tipp:

    Poste mal alle dateien, damit wir dir folgen können. Aber kürz den unwichtigen Inhalt mit

    /*  Hier der Restliche Code  */
    

    weg. Hier gehts in ersterline um die includes. Die sind wichtig!



  • Das ist my.h:

    extern int foo;
    void print_foo();
    void print(int);
    

    Das sind die includes der my.cpp:

    #include "stdafx.h"
    #include "my.h"
    #include "std_lib_facilities.h"
    // und der code
    void print_foo(){
    	cout << foo << '\n';
    }
    
    void print(int i){
        cout << i << '\n';
    }
    

    Und das der use.cpp:

    #include "stdafx.h"
    #include "my.h"
    // und der code
    int main()
    {
        foo = 7;
    	print_foo();
    	print(99);
    	char cc;
    	cin >> cc;
    	keep_window_open();
        return 0;
    }
    

    Das ist alles wo mit ich arbeite.



  • Ich glaube du kannst das so schreiben:Das ist my.h:

    extern int foo;
    void print_foo();
    void print(int);
    

    Das sind die includes der my.cpp:

    #include "stdafx.h"
    #include "my.h"
    #include "std_lib_facilities.h"
    

    Und das der use.cpp:

    //#include "stdafx.h"
    //#include "my.h"
    

    Da die schon in my.cpp inculdet wurden, brauchst du die in use.cpp nicht mehr einbinden. Für den Compiler ist das ganze nach der Arbeit des Linkers eine Datei im gaesamten. Keine headerdateien, nur eine einzige .cpp Datei. Von daher ist es besser, wenn du in use.cpp oder in my.cpp #include "stdafx.h" und #include "my.h" weglässt.



  • Also ich schriebe mal den ganzen Text dieser Übung. Diese Übung kommt aus dem Buch: Einführung in die Programmierung mit C++.



  • Legen Sie drei Dateien an: my.h, my.cpp , und use.cpp. Die Headerdatei my.h soll folgende Deklarationen enthalten:

    extern int foo;
    void print_foo();
    void print(int);
    

    Die Quelldatei my.cpp kopiert mittels #include die Headerdateien my.h und std_lib_facilities.h ein und definiert print_foo(), um den Wert foo mit cout auszugeben, sowie print(int i), um den Wert von i mit cout auszugeben.

    Die Quelldatei use.cpp kopiert mittels #include die Headerdatei my.h ein, definiert main(), um den Wert von foo auf 7 zu setzen und anschliessend mit print_foo() den Wert von foo und mit print() den Wert 99 auszugeben. Beachten Sie, dass use.cpp nicht die Headerdatei std_lib_facilities.h einbindet, da sie ihre Elemente direkt verwendet.

    Kompilieren Sie die Daetein und führen Sie das Programm aus. Unter Windows müssen Sie use.cpp und my.cpp zu einem Projekt zusammenfassen und in use.cpp den Code {char cc; cin>>cc;} ergämzen, damit Sie die Ausgabe sehen können.


Anmelden zum Antworten