Speichern



  • Ich habe schon mal überlegt die Header bei meinen kleinen Projekten einfach komplett wegzulassen.


  • Mod

    DerNoob schrieb:

    Oha so viele Antworten 😃
    Ist mit "header" gemeint über

    int main()
    

    ?

    Header sind die Dinger, die du mittels #include einbindest. Da stehen Signaturen von Funktionen drin, werden Klassen drin definiert, usw.

    Weil mir wurde erklärt vom Lehrer das dieses

    using namespace std;
    

    dafür da ist, dass man nicht mehr bei den includes das .h hinschreiben muss und man automatisch die neueren Bibilotheken hat.
    Stimmt das?

    Nein, das ist absoluter, vollkommener Unsinn. Ich fürchte, dein Lehrer hat selber keine Ahnung.

    Und wenn ihr sagt man sollte damit anfang würde ich das gerne.
    Aber ich verstehe nicht richtig wie ich darauf kommen sollte ob ich das vor einem "Switch, Case, If, ..." schreiben muss. Gibt es da eine bestimmte Regel??

    Ja. Das eine sind elementare Sprachelemente (switch, case, if, ...), das andere bezieht sich auf Funktionen, Klassen und Objekte der Standardbibliothek. Letztere sind alle im Namespace std. Außer, du nutzt alte C-Header (die mit .h) dran), da sind sie global. Achtung: Makros der Standardbibliothek (z.B. assert, XXX_MIN und XXX_MAX) sind nicht in Namespaces. Makros sind kein "richtiger" Bestandteil der Sprache und halten sich nicht an viele Regeln, die sonst gelten.

    Das Problem für dich wird nun wohl sein, dass du nicht sauber zwischen den Schlüsselworten der Sprache und zwischen den Elementen der Standardbibliothek unterscheiden kannst, da du noch nicht vertraut genug bist, mit den verschiedenen Elementen der Sprache. Faustregel: Wenn du für etwas einen Header einbinden musst, dann ist es kein Schlüsselwort der Sprache.

    Oder muss man das auf einer Seite nachschlagen ob ich das davor schreiben muss?

    Allgemeine Referenzen
    en.cppreference.com
    www.cplusplus.com

    Auf diesen Seiten:
    Die Schlüsselworte der Sprache:
    http://en.cppreference.com/w/cpp/keyword
    Du siehst, das sind nicht viele.

    Referenz der Standardbibliothek (umfangreich!):
    http://en.cppreference.com/w/cpp/header
    http://www.cplusplus.com/reference/



  • Hey 😃

    Also so langsam frage ich mich auch was das für ein Lehrer ist.. 😕

    Du hast mir ein Link über die Schlüsselwörter gegeben. Ich dachte Schlüsselwörter wären soetwas wie "cout" oder "cin". Oder sind das Wörter die mit der Bibilothek zusammen hängen? Und die in deinem Link brauchen keine Header Datei?

    Sorry das ich jedzt nochmal Fragen muss aber ich verstehs immer noch nicht richtig...... 😞
    Woran erkenne ich vor welchen Wörtern ich jedzt ein std:: setzten muss?

    ps: Bitte für ganz ganz doofe erklären 😃


  • Mod

    DerNoob schrieb:

    Du hast mir ein Link über die Schlüsselwörter gegeben. Ich dachte Schlüsselwörter wären soetwas wie "cout" oder "cin". Oder sind das Wörter die mit der Bibilothek zusammen hängen?

    Ja, cn und cout sind keine Schlüsselwörter. cin und cout sind zwei globale Variablen vom Typ std::istream bzw. std::ostream. Im Header iostream werden die beiden bekannt gemacht. Referenzen:

    http://www.cplusplus.com/reference/iostream/
    http://www.cplusplus.com/reference/iostream/cin/
    http://www.cplusplus.com/reference/iostream/cout/
    http://en.cppreference.com/w/cpp/io/cin
    http://en.cppreference.com/w/cpp/io/cout

    Und die in deinem Link brauchen keine Header Datei?

    So ist es.

    Woran erkenne ich vor welchen Wörtern ich jedzt ein std:: setzten muss?

    ps: Bitte für ganz ganz doofe erklären 😃

    Daran, dass sie Teil der Standardbibliothek sind. Ja, das ist keine Erklärung für ganz doofe, aber einfacher kann ich es nicht beschreiben. Ich habe ja schon gesagt, dass Dinge, die in Headern definiert werden keine Schlüsselworte sind. Sofern dies ein Header der Standardbibliothek ist (jetzt am Anfang sind vermutlich alle Header, die du benutzt aus der Standardbibliothek, außer du hast sie selber geschrieben), dann sind die dort definierten Bezeichner im Namensraum std (bis auf ganz wenige Ausnahmen).
    Du kannst auch jeweils bei den schon verlinkten Referenzen gucken (die haben eine Suchfunktion), ob und wie die Bezeichner dort auftauchen. Wie du siehst, steht in der Referenz, dass cout eigentlich std::cout heißt und in iostream bekannt gemacht wird. Wenn du hingegen nach "for" suchst, dann findest du gort gar nichts, weil "for" keine Funktion der Standardbibliothek ist, sondern ein grundlegender Teil der Sprache.



  • Schau mal hier nach http://de.cppreference.com/w/. Schluesselwoerter sind Teil der Sprache C++ und Klassen und Funktionen, die mit den C++ Compilern ausgeliefert werden, gehoeren zur Standardbibliothek von C++, deswegen auch der Namensraum std::

    Welche dies nun sind muss du halt lernen.



  • Also müsste ich mich hinsetzen und alles Schlüsselwörter von dem

    #include <iostream.h>
    

    lernen damit ich weiß ob ich davor std:: machen. Oder würde das reichen wenn ich die Schlüsselwörter lerne die keine Header Datei benötigen und bei dem Rest einfach ein std:: davor mache?



  • Sry für Doppelpost, aber ich glaube langsam verstehe ich es 😃
    Die Standartbibilothek muss ich nicht einbinden??
    Und wenn ja ist das immer die gleiche?



  • DerNoob schrieb:

    Also müsste ich mich hinsetzen und alles Schlüsselwörter von dem

    #include <iostream.h>
    

    lernen damit ich weiß ob ich davor std:: machen. Oder würde das reichen wenn ich die Schlüsselwörter lerne die keine Header Datei benötigen und bei dem Rest einfach ein std:: davor mache?

    Halt, du verstehst etwas falsch.
    Der Header heißt iostream ohne .h!
    Ich hole mal weit aus:
    Ein Schlüsselwort ist ein elementarer Bestandteil der Sprache. Sie werden genutzt um die grundlegenden Mittel der Sprache zu verwenden.
    Beispiele sind if, for, class, int, etc. Der Compiler sieht diese beim Compilen und hat dort eine feste, hartcodierte Bedeutung.
    Aber allein mit Schlüsselwörtern kann man kein Programm schreiben. Man kann zwar eine Variable erzeugen, z.B. vom Typen int, aber man kann sie weder einlesen lassen noch auslesen lassen.
    Da IO ein elementare Bestandteil von jedem Programm ist, dachte man sich: Es wär doch toll, wenn man automatisch Dinge zur Verfügung haben könnte, die IO machen.
    Diese Dinge sind in C++ die Klassenhierachie rund um istream und ostream. Damit der Compiler weiß, was das ist, benötigt er die Deklarationen der Funktionen. Da steht drin die Funktion mit dem Namen get() verlangt keine Argumente und liefert einen char zurück. Damit kann er überprüfen, ob der Anwender get() richtig verwendet. Diese Deklarationen stehen u.a. in der Headerdatei iostream (ohne .h). Der Linker weiß im nachfolgenden Schritt aber immer noch nicht, was get() macht. Dazu schaut er in der Bibliotheksdatei nach (da, wo die kompilierten Definitionen der Funktionen stehen) und macht Anpassungen am Code.
    Jede Bibliothek funktioniert nach diesem Prinzip. Man muss dem Compiler sagen, wo er die Headerdateien mit den Deklarationen findet und wo er die Bibliotheksdatei mit den Definitonen findet. Da es sich bei iostream aber um einen Bestandteil der Standardbibliothek handelt, wird das automatisch gemacht.
    Und alle Sachen der Standardbibliothek sind grundlegende Funktionen und Klassen, die man in fast jedem Programm braucht. Es sind aber keine eingebauten Schlüsselwörter.
    Und um Namenskonflikte zu vermeiden befinden sich all diese Funktionen und Klassen im namespace std. using namespace std sagt dem Compiler nur: Wenn du xy nicht im globalen Namensraum findest, such auch im Namensraum std.
    Mehr macht das nicht.



  • Nathan schrieb:

    Der Compiler sieht diese beim Compilen und hat dort eine feste, hartcodierte Bedeutung.

    Nicht wenn sie sich in einem attribute-token befinden!

    The identifiers shown in Table 4 are reserved for use as keywords (that is, they are unconditionally treated
    as keywords in phase 7) except in an attribute-token (7.6.1)



  • arkot333 schrieb:

    Nathan schrieb:

    Der Compiler sieht diese beim Compilen und hat dort eine feste, hartcodierte Bedeutung.

    Nicht wenn sie sich in einem attribute-token befinden!

    The identifiers shown in Table 4 are reserved for use as keywords (that is, they are unconditionally treated
    as keywords in phase 7) except in an attribute-token (7.6.1)

    *facepalm*



  • Achsoo, also wenn ich das richtig verstanden habe ist das std:: dafür da das man dem Compiler etwas hilft (das er sofort in die Header Datein guckt) ?
    Und diese Schlüsselwörter sind in der Standartbibilothek (also kein std:: davor)?
    http://de.cppreference.com/w/cpp/keyword
    Und wenn "cout und cin" nicht dadrin sind muss (kann) ein std:: davor??



  • DerNoob schrieb:

    Achsoo, also wenn ich das richtig verstanden habe ist das std:: dafür da das man dem Compiler etwas hilft (das er sofort in die Header Datein guckt) ?
    Und diese Schlüsselwörter sind in der Standartbibilothek (also kein std:: davor)?
    http://de.cppreference.com/w/cpp/keyword
    Und wenn "cout und cin" nicht dadrin sind muss (kann) ein std:: davor??

    Mach using namespace std; und vergiss erstmal std::.
    In deinem Stadium lenkt das bloss vom Wesentlichen ab.



  • Hey.. die anderen meinten man sollte damit direkt am anfang anfange..
    Ist aber auch egal ich würde das gerne verstehen warum und bei welchen man dies macht deswegen wollte ich eine Rückmeldung auf meinen Vorherigen Post ob ich das jedzt richtig verstanden habe 🙂



  • DerNoob schrieb:

    Achsoo, also wenn ich das richtig verstanden habe ist das std:: dafür da das man dem Compiler etwas hilft (das er sofort in die Header Datein guckt) ?

    Nein, beim Compilieren gibt es keine Headerdateien mehr. Der Präprozessor bearbeitet alles mit dem # Symbol, im Fall von include nimmt er den Inhalt der Datei und fügt ihn an der Stelle im Code ein.
    Das std:: sagt einfach: Suche nach der Funktion func nicht im globalen Namensraum (=außerhalb namespace), sondern im Namensraum std.

    Und diese Schlüsselwörter sind in der Standartbibilothek (also kein std:: davor)?

    Nein, diese Schlüsselwörter sind eben nicht in der Standardbibliothek. if und Co kannst du verwenden ohne einen Header eingefügt zu haben.

    http://de.cppreference.com/w/cpp/keyword
    Und wenn "cout und cin" nicht dadrin sind muss (kann) ein std:: davor??

    Jein.
    Schlüsselwörter - die in der Liste - sind in der Sprache eingebaut und brauchen nichts, damit sie vom Compiler verstanden werden, keine Header, keine Namespaces.
    Aber nicht alles, was kein Schlüsselwort ist, muss mit std:: qualifiziert werden.
    Es kommt darauf an, wo die Dinge definiert werden. Werden sie in einem Namensraum deklariert (wie in fast allen C++ Bibliotheken). muss man sie mit dem entsprechenden Namensraum qualifizieren.
    Du musst einfach wissen, wo die Dinge deklariert werden. In großen Projekten ist es nicht unüblich, dass man mehrere Namensräume hat. Man muss nur wissen, was woher stammt.
    Aber das geht hier eigentlich schon zu weit.
    Ich empfehle dir parallel ein gutes Grundlagenbuch zu lesen. Links gibts hier im Forum. Die Autoren können das garantiert besser und chronologischer erklären als ich. 😉



  • Danke Nathan für die Antwort.
    Kannst du mir ein Buch empfehlen?? 😃
    Ohne eine ewig lange Bücherliste und ich muss mir eins raussuchen? :p



  • hey nochmal zurück zum speichern..
    Ich habe das in mein compiler gegeben und enie text.txt erstellt im gleichem Ordern..
    Aber der Compiler sagt mir viele Fehlermeldungen


  • Mod

    DerNoob schrieb:

    Aber der Compiler sagt mir viele Fehlermeldungen

    Dann werden da wohl Fehler sein.
    http://www.c-plusplus.net/forum/200753
    http://www.c-plusplus.net/forum/304133
    http://www.tty1.net/smart-questions_de.html



  • Also vorhin hats geklappt 😕
    Nun steht da

    "Der Bezweichner 'save' mehrfach deklariert"
    "'save' bereits deklariert"

    Und das ist mein Code:

    #include <iostream>
    #include <fstream>
    
    int main (void) {
    
    int eins =2;
    
        std::ofstream save("test.txt");
        save << eins;
    
        std::ifstream save ("test.txt");
        save >> eins;
    
        return 0;
    
    }
    

  • Mod

    DerNoob schrieb:

    "Der Bezweichner 'save' mehrfach deklariert"
    "'save' bereits deklariert"

    Jetzt denk doch mal darüber nach, was dies wohl bedeuten mag.



  • DerNoob schrieb:

    int eins =2;
    

    Sehr subtil... 🙂


Anmelden zum Antworten