Probleme mit #include und using namespace std;



  • Hallo zusammen,😊
    ich weiß nicht in welcher Reihenfolge oder nach welchen Regeln ich Includeanweisunungen und "using namespace std;" einfügen soll.

    Ich habe gelesen dass man:

    1. using namespace std immer unter die Includeanweisungen schreiben soll
    2. using namespace std niemals in den Header schreiben soll

    Das habe ich auch so befolgt. Allerdings bekomme ich tausend Fehler beim compilieren. Oder auch nur
    "BUILD FAILED (exit value 2, total time: 4s)"

    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 .h ganz nacg oben müssen? Also das alle Includeanweisungen darunter bzw. innerhalb stehen?

    Vielen Dank schonmal🙂

     
    #ifndef MATRIX_H
    #define MATRIX_H
    
    
    #include "Zeile.h"
    //#include "Zustand.h"
    
    #include <string>
    #include <vector>
    #include <cmath> 
    #include <limits> 
    #include <iostream>
    #include <iomanip>
    
    class Matrix {
    private:
        vector<Zeile> matrixVec;
        uint zeilenDim, spaltenDim;
        static bool zeigeZwischenergebnisse;
    public:
    
        //Konstruktoren
        Matrix();
        Matrix(uint _zeilenDim, uint _spaltenDim, ifstream& _f_in);
        Matrix(uint _zeilenDim, uint _spaltenDim);
    
        //Getter-Methoden
         const uint& gib_n() const;
         const uint& gib_m() const;
    
        //Operatorueberladungen
        friend ostream& operator<<(ostream& out, const Matrix& printMatrix);
         Matrix& operator=(const Matrix& orig);
    
    
        //Methoden
         Matrix reduzierteStufenform() const;
         static void protokoll_aus();
         static void protokollSwitch();
         static bool doubleGleich(double d1, double d2);
    
    
    
    };
    
    
    
    #endif /* MATRIX_H */
    
     
    
    
    #ifndef ZEILE_H
    #define ZEILE_H
    
    
    #include<fstream>
    #include<string>
    #include<vector>
    #include<cmath>
    #include<iostream>
    #include<limits>
    
    
    class Zeile {
    private:
        bool varistNullzeile;
        uint spaltenDim;
    
    public:
        vector<double> zeilenElemente;
    
        //Defaultkonstruktor
        Zeile();
        //Konstruktor
        Zeile(uint _zeilenLaenge, ifstream& _f_in);
        //Operatorueberladungen
        double operator[](uint zeilenIndex);
        Zeile operator+=(const Zeile& orig);
        Zeile operator*=(const double faktor);
        Zeile& operator=(const Zeile& orig);
    
        //Methoden
        Zeile& Einlesen(uint _zeilenLaenge, ifstream& _f_in);
        bool istNullzeile();
    
    
    };
    
    #endif /* ZEILE_H */
    
    
    #include "Matrix.h"     
    #include "Zeile.h"
    //#include "Zustand.h"        
    
    #include<iostream>
    #include<fstream>
    #include <cstdio>
    
    using namespace std;
    bool Matrix::zeigeZwischenergebnisse = true; // Protokoll an
    typedef unsigned int uint;
    
    int main() {
    //    thread t1 (switchP);
            
        ifstream f_in;
        f_in.open("Matrixdaten");
    
    
        cout << "Matrixtest" << endl;
        cout << "----------" << endl;
        try {
            Matrix A(4, 5, f_in);
    
        
            while (true){
            cout << "A: " << A.gib_m() << "x" << A.gib_n() << endl;
            cout << A << endl;
            Matrix StufeA(A.reduzierteStufenform());
            cout << "Stufenform: " << endl;
            cout << StufeA << endl;
            cout << endl << string(20,'_') << endl << endl;
    
            cout << "Bitte 'O' fuer Optionen eingeben" << endl
                    << "Die Nächste Matrix mit Enter" << endl;
            
            char s = cin.get();
    //        if (s == 'o') Matrix::config();
            }
            
               
    
        } catch (string& fehlermeldung) {
            cout << "!!!  " << fehlermeldung << endl;
        }
    
        f_in.close();
        
        
        return 0;
    }


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

    niemals Includeanweisungen in den Header schreiben soll

    Was? using namespace std sollte nicht im Header stehen. Ansonsten ist es egal, wo es steht. Man muss es auch nicht benutzen und kann stattdessen std::cout usw. schreiben.

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

    Allerdings bekomme ich tausend Fehler beim compilieren

    Von oben nach unten abarbeiten.



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

    niemals Includeanweisungen in den Header schreiben soll

    Was? using namespace std sollte nicht im Header stehen. Ansonsten ist es egal, wo es steht. Man muss es auch nicht benutzen und kann stattdessen std::cout usw. schreiben.

    oh sorry- Stimmt, habe ich geändert.

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

    Von oben nach unten abarbeiten.

    Ja der erste Fehler ist:
    "Zeile.h:20:5: error: 'vector' does not name a type"
    und die darunter sind auch nach dem Schema.

    Also schließe ich daraus dass es ein Problem mit dem namespace oder Includeanweisungen gibt.
    An der Stelle weiß ich aber nicht weiter und drehe mich auch im Kreis mit dem herumprobieren😩



  • @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 {
    	  // ...
    	};
    )
    

Log in to reply