Variable aus externe datei includieren ?



  • 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
    


  • Analyse schrieb:

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

    Objektorientierte Programmierung, Strukturierte Programmierung. Such’s dir aus. Und kauf dir ein vernünftiges C++ Buch. Aus gegebenem Anlass kann ich DAS HIER empfehlen.

    mfg, René~



  • so hat es leider auch nicht funktioniert "Lösung", bekomme obwohl ich in beiden .cpp dateien die header datei mit der deklaration einbinde ein "nicht deklariert" als fehlermeldung.

    Naja ich merke schon das ich die geduld von einigen hier langsam überstrapaziere 🙄

    Danke für den tipp Rene aber ich habe bereits ein c++ buch was sogar fast den gleichen titel hat, leider ist es eine qual mit diesen büchern, bis ich da mal was gefunden habe...(trotz inhaltsverzeichniss..)
    dachte eigentlich das ist hier schnell gelöst aber scheint ja nun nicht so zu sein.

    Danke an alle, ich werd mir jetzt doch nochmal das buch raussuchen und versuchen das alleine zu lösen.



  • Analyse schrieb:

    Danke für den tipp Rene aber ich habe bereits ein c++ buch was sogar fast den gleichen titel hat, leider ist es eine qual mit diesen büchern, bis ich da mal was gefunden habe...(trotz inhaltsverzeichniss..)

    lol! Um C++ zu lernen liest man das Buch auch von links nach rechts durch und springt da nicht im Buch drin rum weil man meint, dass man schon alles kann, aber dann nicht mal weiß was die Funktion main() macht..

    mfg, René~



  • Mal eine andere Sache. Eigentlich arbeitet man nicht mit globalen Variablen. Und wenn man das berücksichtigt, dann ergibt sich das Problem mit extern auch nicht.


Anmelden zum Antworten