Probleme mit #include und using namespace std;



  • @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Muss man "using namespace std" auch in die einzelnen .cpp-Datein schreiben oder reicht es wenn man "using namespace std;" nur einmal in die Main schreibt?

    Wenn du in der cpp-Datei den Namespace nicht angeben willst, muss dort auch das using namespace std enthalten sein.



  • @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Wie bindet man denn "using namespace std" und die Inludeanweisungen korrekt ein?
    Muss man "using namespace std" auch in die einzelnen .cpp-Datein schreiben oder reicht es wenn man "using namespace std;" nur einmal in die Main schreibt?
    Stimmt es dass die includeguards in der .cpp ganz nacg oben müssen?

    Includeguards haben in .cpp-Dateien nichts verloren, sie gehören aber in die .h-Dateien!
    using namespace ... gehört, wenn überhaupt, in die cpp-Datei. Geh damit sparsam um, vermeide es auch gerne ganz. So schlimm ist es nicht, std::string statt string zu schreiben.

    Ratschlag: in der cpp-Datei in der ersten Zeile die zugehörige .h-Datei includen. Danach eine Leerzeile, dann alle weiteren benötigten Header alphabetisch auflisten. Dadurch ist sichergestellt, dass du in deiner .h-Datei nicht irgendein include vergessen hast, das im cpp vorher geladen wurde. Selbstverständlich kannst du auch im .h andere Include-Dateien includen.

    Zu deinem Fehler: "Zeile.h:20:5: error: 'vector' does not name a type"
    -> Ersetze vector durch std::vector und stelle sicher, dass du in dem Header ein #include <vector> stehen hast.



  • @philipp2706 sagte in Probleme mit #include und using namespace std;:

    "Zeile.h:20:5: error: 'vector' does not name a type"

    std::vector ...



  • @wob sagte in Probleme mit #include und using namespace std;:

    @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Wie bindet man denn "using namespace std" und die Inludeanweisungen korrekt ein?
    Muss man "using namespace std" auch in die einzelnen .cpp-Datein schreiben oder reicht es wenn man "using namespace std;" nur einmal in die Main schreibt?
    Stimmt es dass die includeguards in der .cpp ganz nacg oben müssen?

    Includeguards haben in .cpp-Dateien nichts verloren, sie gehören aber in die .h-Dateien!
    using namespace ... gehört, wenn überhaupt, in die cpp-Datei. Geh damit sparsam um, vermeide es auch gerne ganz. So schlimm ist es nicht, std::string statt string zu schreiben

    ach man🙄 ja klar ich meinte .h. Hab ich geändert.

    @manni66 sagte in Probleme mit #include und using namespace std;:

    @philipp2706 sagte in Probleme mit #include und using namespace std;:

    "Zeile.h:20:5: error: 'vector' does not name a type"

    std::vector ...

    Ja das funktioniert so.
    Ich würde aber gerne im gesamten Programm den namespace std verwenden, auch wenn das schlechter Stil ist.

    @manni66 sagte in Probleme mit #include und using namespace std;:

    @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Muss man "using namespace std" auch in die einzelnen .cpp-Datein schreiben oder reicht es wenn man "using namespace std;" nur einmal in die Main schreibt?

    Wenn du in der cpp-Datei den Namespace nicht angeben willst, muss dort auch das using namespace std enthalten sein.

    ich habe ja in den .cpp Dateien "using namespace std;" geschrieben. Die Fehler z.B.
    "Matrix.h:18:5: error: 'vector' does not name a type" oder
    "Matrix.h:25:47: error: 'ifstream' has not been declared"
    treten ja aber in den header Dateien auf.

    Aber ich darf den namespace ja nicht in die Header schreiben🤔

    @wob sagte in Probleme mit #include und using namespace std;:

    Geh damit sparsam um,

    Am liebsten würde ich ja nur einmal "using namespace std;" in die main schreiben und damit innerhalb des gesamten Programms den namespace bekannt machen.



  • @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Aber ich darf den namespace ja nicht in die Header schreiben

    Darf?

    @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Ich würde aber gerne im gesamten Programm den namespace std verwenden, auch wenn das schlechter Stil ist

    Niemand hindert dich daran, dummes Zeug zu tun.



  • @philipp2706 sagte in Probleme mit #include und using namespace std;:

    @wob sagte in Probleme mit #include und using namespace std;:

    Geh damit sparsam um,

    Am liebsten würde ich ja nur einmal "using namespace std;" in die main schreiben und damit innerhalb des gesamten Programms den namespace bekannt machen.

    Mit sparsam meinte ich eigentlich eher den Bereich, für den das gelten soll, nicht die Anzahl, wie oft du das schreibst. Kein Compiler hindert dich daran, im Header "using namespace std;" zu schreiben. Alle vernünftigen C++-Programmierer würden dir allerdings davon abraten. Also: verwende kein "using namespace" in Header-Dateien. Wenn du unbedingt willst, schreib das "using namespace std;" in all deine cpp-Dateien hinter die #include <...>-Anweisungen.



  • Ich bin nicht so sicher, dass das grundsätzlich dummes Zeug ist. Wenn man in seiner kleinen Welt lebt und sowieso überall den Namespace std aufmacht, was solls?

    Problematisch wird es, wenn man eine Bibliothek für andere bereitstellt, die dann einen Header einbinden und zwangsweise den Namespace geöffnet kriegen, obwohl sie das in ihrem Projekt vielleicht nicht wollen.



  • @manni66 sagte in Probleme mit #include und using namespace std;:

    @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Aber ich darf den namespace ja nicht in die Header schreiben

    Darf?

    Darf bzw. sollte ich nicht machen, nachdem was ich so gelesen habe.

    @wob sagte in Probleme mit #include und using namespace std;:

    unbedingt willst, schreib das "using namespace std;" in all deine cpp-Dateien hinter die #include <...>-Anweisungen.

    Das habe ich gemacht. Aber das Resultat ist, dass der Compiler mir tausend Fehlermeldungen ausgibt. Und die Fehler treten in den Headerdateien auf.

    @bashar sagte in Probleme mit #include und using namespace std;:

    Ich bin nicht so sicher, dass das grundsätzlich dummes Zeug ist. Wenn man in seiner kleinen Welt lebt und sowieso überall den Namespace std aufmacht, was solls?

    Okay vielleicht sollte ich dann doch "using namespace std;" in die Header-Dateien schreiben



  • @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Darf bzw. sollte ich nicht machen, nachdem was ich so gelesen habe.

    Dann halte dich entweder daran und schreibe std::vector oder halte dich nicht daran.



  • @philipp2706 sagte in Probleme mit #include und using namespace std;:

    Aber das Resultat ist, dass der Compiler mir tausend Fehlermeldungen ausgibt. Und die Fehler treten in den Headerdateien auf.

    Dann fügst du halt 1000x "std::" ein. Wobei das sicher übertrieben ist. Ersetze alle vector und string durch std::vector und std::string in all deinen Header-Dateien und du hast die meisten Fehler raus.

    Zur Not nimm halt dies (sofern du unter Linux bist)

    for i in *.h; do perl -pi -e 's/(?<!std::)\b(vector|string|ifstream|ofstream|cin|cout)\b/std::$1/g' $i; done
    


  • @bashar sagte in Probleme mit #include und using namespace std;:

    Ich bin nicht so sicher, dass das grundsätzlich dummes Zeug ist. Wenn man in seiner kleinen Welt lebt und sowieso überall den Namespace std aufmacht, was solls?

    Problematisch wird es, wenn man eine Bibliothek für andere bereitstellt, die dann einen Header einbinden und zwangsweise den Namespace geöffnet kriegen, obwohl sie das in ihrem Projekt vielleicht nicht wollen.

    Wenn man die Entscheidung bewusst trifft ist das ok, weil man sich über die möglichen Probleme im Klaren ist. Wenn das jemand macht nachdem er das so gelesen hat besser nicht, weil er keine Ahnung hat warum man das nicht machen sollte.



  • Wenn dich das häufige Schreiben von std:: stört, so kannst du auch einen eigenen Namensbereich (namespace) erzeugen und dadrin dann einzeln die benutzten Datentypen einbinden:

    namespace MyMath
    {
    	using std::vector;
    	using std::istream;
    	using std::ostream;
    
    	class Matrix {
    	  // ...
    	};
    )
    

Anmelden zum Antworten