Variable aus externe datei includieren ?



  • Hallo,

    ich will einen string den ich zuvor in der datei a.cpp festgelegt habe in der datei b.cpp benutzen.

    //a.cpp
    #include <iostream>
    using namespace std;
    
    extern string teststring;
    
    main(){
        teststring="Jawoll";
    }
    
    //b.cpp
    #include <iostream>
    using namespace std;
    
    main(){
        cout << teststring;
    }
    

    Was fehlt da noch ? oder ist es komplett mist ?

    Mfg Analyse



  • Das extern ist in der falschen Datei.

    Du musst ja dem compiler sagen, dass das Symbol irgendwo definiert ist und er das erst beim Linken findet.


  • Mod

    Falschrum. In der b.cpp musst du extern string teststring; schreiben.

    //a.cpp
    string teststring="Jawoll";
    
    // b.cpp
    extern string teststring;
    int main(){
        cout << teststring;
    }
    


  • Hmm,

    bekomme ein "undefined reference to `teststring'" als fehler.

    #include <iostream>
    using namespace std;
    
    main(){
        string teststring="Jawoll";
    }
    
    #include <iostream>
    using namespace std;
    
    extern string teststring;
    main(){
        cout << teststring;
    }
    


  • Mach einen Header und schreibe da das extern rein. Dann initialisierst du den string in a.cpp und kannst ihn jeder Datei benutzen, in der du den Header einbindest.



  • #include <iostream> 
    using namespace std; 
    
    string teststring="Jawoll"; // nicht lokal!
    
    main(){ 
    }
    


  • Ne, also irgendwie hauts noch nicht hin.

    Hab jetzt 3 dateien, a.cpp; b.cpp; a.h

    a.cpp:

    #include <iostream>
    using namespace std;
    
    string teststring="Jawoll"; // nicht lokal!
    main(){
    }
    

    b.cpp:

    #include <iostream>
    #include "a.h"
    using namespace std;
    
    main(){
    cout << teststring;
    }
    

    a.h:

    #ifndef A_H_INCLUDED
    #define A_H_INCLUDED
    
    extern string teststring;
    
    #endif // A_H_INCLUDED
    

    Wenn ich b.cpp öffnen will bekomm ich immernoch "undefined reference to `teststring'" als fehlermeldung 😞



  • Wenn man deinen Code zum Laufen bringt ( #include <string> , extern std::string , main() raus aus a.cpp, int vor main() in b.cpp, ...), dann ist er korrekt. Dein Fehler liegt also in der Art und Weise, wie du die Dateien kompillierst.


  • Mod

    Du musst den Objectcode der a.cpp natürlich mitlinken. Das ist es was die undefined reference bedeutet. Woher soll denn auch sonst der teststring kommen?



  • Übrigens muss deine main() -Funktion in C++ auf eine der folgenden Arten deklariert sein:

    int main();
    int main(int argc, char** argv);
    

    Den Rückgabetyp wegzulassen, wenn es sich um int handelt, ist nicht erlaubt!



  • Ok, jetzt funktioniert es.

    lösung:

    //////////////a.cpp
    #include <iostream>
    #include <string>
    
    extern std::string teststring="Jawoll";
    
    //////////////b.cpp
    #include <iostream>
    #include "a.cpp"
    using namespace std;
    
    int main(int argc, char** argv){
    cout << teststring;
    }
    

    Und schon gibt es das nächste problem, im oben gezeigten beispiel funkioniert es noch, aber in meinem projekt habe ich zwei .cpp dateien mit jeweils einer main() funktion. Der compiler gibt mir den fehler:

    declaration of C function 'int main()' conflicts with previous declaration 'int main(int, char**)'

    Muss ich da jetzt (wie bei den header dateien) mit ifdef abfragen ob es main gibt ?


  • Mod

    Analyse schrieb:

    Ok, jetzt funktioniert es.

    lösung:

    //////////////a.cpp
    #include <iostream>
    #include <string>
    
    extern std::string teststring="Jawoll";
    
    //////////////b.cpp
    #include <iostream>
    #include "a.cpp"
    using namespace std;
    
    int main(int argc, char** argv){
    cout << teststring;
    }
    

    😕 Das funktioniert? Das ist eigentlich falsch.

    Und schon gibt es das nächste problem, im oben gezeigten beispiel funkioniert es noch, aber in meinem projekt habe ich zwei .cpp dateien mit jeweils einer main() funktion. Der compiler gibt mir den fehler:

    declaration of C function 'int main()' conflicts with previous declaration 'int main(int, char**)'

    Muss ich da jetzt (wie bei den header dateien) mit ifdef abfragen ob es main gibt ?

    Die main Funktion ist der Einstiegspunkt deines Programms. Wie kannst du mehrere Einstiegspunkte haben? Du musst dich schon für einen entscheiden.



  • SeppJ schrieb:

    😕 Das funktioniert? Das ist eigentlich falsch.

    Sofern er den Header nur in einer .cpp-Datei inkludiert, kann er dort schon eine Variablendefinition hinschreiben. Oder meinst du was Anderes?


  • Mod

    Nexus schrieb:

    SeppJ schrieb:

    😕 Das funktioniert? Das ist eigentlich falsch.

    Sofern er den Header nur in einer .cpp-Datei inkludiert, kann er dort schon eine Variablendefinition hinschreiben. Oder meinst du was Anderes?

    Der string wird doch nirgends definiert! Wo bekommt der Linker den her? Oder übersehe ich gerade etwas?

    Außerdem:
    `#include "a.cpp"

    `



  • Analyse schrieb:

    #include "a.cpp"
    

    Ja, so klappt es 😃 .

    Oh [/quote] vergessen...



  • Das inkludieren einer cpp-Datei funktioniert und ist auch nicht falsch. Aber man macht es trotzdem nicht, um zum Beispiel nicht alle cpp-Dateien neu übersetzten zu müssen, die nicht geändert wurden.



  • SeppJ schrieb:

    Der string wird doch nirgends definiert! Wo bekommt der Linker den her? Oder übersehe ich gerade etwas?

    Ja,

    extern std::string teststring="Jawoll";
    

    ist eine Definition. So ist es aber selten sinnvoll.

    Das include "a.cpp" habe ich tatsächlich übersehen. Nie .cpp-Dateien einbinden!



  • SeppJ schrieb:

    Der string wird doch nirgends definiert! Wo bekommt der Linker den her? Oder übersehe ich gerade etwas?

    Der er in jeder cpp-Datei auch eine main-Funktion stehen hat, wird das wohl nicht alles sein.



  • Langsam versteh ich garnichtsmehr.

    Ich habe ein projekt, das ich der übersichtlichkeit wegen in mehrere dateien splitten will. In der ersten datei sollen nun zb. werte errechnet werden, die ich in der zweiten datei abrage und mit denen weiterrechne.

    Wie soll das gehen wenn ich nur eine main() benutzen darf ?



  • Mit der main() Funktion steigst du in dein Programm ein. Dann kannst du alles was du machen willst packst du in Funktionen und rufst die in der main auf. Wenn du nicht weißt, was Funktionen sind, dann fang nochmal gaaanz vorne mit C++ an. Und um jetzt nochmal zu dem extern zurückzukommen. So ist es richtig:

    // extern.h
    extern std::string test;
    
    // a.cpp
    #include "extern.h"
    test = "teststring";
    // hier kannst du jetzt die Variable 'test' benutzen
    
    //b.cpp
    #include "extern.h"
    // hier auch, wenn du extern.h inkludiert hast
    

Log in to reply