Verständnissproblem bei Funktionsdeklaration



  • Hallo,

    in meinem Buch "C++ von A bis Z" steht auf Seite 99 steht geschrieben ,dass man eine Funktion zuerst deklarieren und definieren muss um sie nacher aufzurufen.
    Auf Seite 178 wird in einem Quellcode nur die Definition für die Funktion eingefügt. Das Programm läuft aber anscheinend auch ohne Deklaration.

    //dynarray2.cpp Seite 178
    #include <iostream>
    using namespace std;

    // hier steht nur die Definition
    int* renew( int* old, int sizeold, int sizenew )
    {
    //Größeren Speicher allozieren
    int* tmp = new int [sizenew];

    //Alten Inhalt nach tmp kopieren
    for( int i=0; i<sizeold; i++)
    {
    tmp[i] = old[i];
    }
    //Alten Inhalt löschen
    delete [] old;
    //Neues Array zurückgeben
    return tmp;
    }

    int main(void)
    {
    int *dynarray = new int[10];
    for( int i=0; i<10; i++)
    {
    dynarray[i] = i;
    }
    //Array vergrößern auf 15. Elemente
    dynarray=renew(dynarray,10,15);
    for( int i=10; i<15; i++)
    {
    dynarray[i] = i;
    }
    for( int i=0; i<15; i++)
    {
    cout << dynarray[i] << '\n';
    }
    cin.get();
    return 0;
    }

    Warum läuft das Programm auch ohne Deklaration und wie füge ich den Code über code tags ein ?



  • in meinem Buch "C++ von A bis Z"

    Oh Gott, das wird heiter, wo ist mein Feuerzeug wenn man es mal braucht? 😕

    Warum läuft das Programm auch ohne Deklaration und wie füge ich den Code über code tags ein ?

    Ganz einfach: Wenn du die Funktion jetzt in main() benutzen willst, aber nicht jede Funktion über der main() definieren willst (z.B. hast du die Deklaration in einer .h-Datei und die Definition wieder in einer anderen cpp-Datei), deklarierst du sie einfach, dann kennt der Compiler den Namen der Funktion und weiß, irgendwo (in irgend einer cpp-Datei meist) steht auch noch die Definition (wenn sie das nicht tut, spuckt dir der Linker einen Error ala unresolved symbol aus). Würdest du sie nicht deklarieren, würde der Compiler dann meckern, weil er den Bezeichner nicht kennt. Wenn du sie jedoch schon über der main() definierst, kannste dir die Deklaration (auch Forward-Deklaration genannt) sparen, da der Compiler in main() die Funktion dann eh kennt.
    Analog gilt das natürlich auch, wenn du Funktionen in verschiedene cpp/h Dateien auslagerst.
    tl;dr: jede Definition ist auch eine Deklaration.
    C/C++ Tags sind unter 🙂 😃 ;), den Code einfach zwischen die Tags schreiben.

    Ach übrigens: von C++ von A bis Z würd ich die Hände von lassen, es ist gerade Anfängern nicht zu empfehlen, weil J.W. selbst noch einer ist.


  • Mod

    Keksman schrieb:

    in meinem Buch "C++ von A bis Z"

    Aua, das Buch ist bekannt als übelst schlecht und gleich wird auch ein Shitstorm losgehen, was an dem Programmbeispiel alles schlecht ist (und zurecht). Siehe auch:
    http://www.c-plusplus.net/forum/272350-full

    Warum läuft das Programm auch ohne Deklaration

    Weil eine Definition auch gleichzeitig eine Deklaration ist.

    und wie füge ich den Code über code tags ein ?

    Guck mal im Editorfenster unten links unter den Smileys.

    Für alle die sich über den Wolf'schen Code lustig machen wollen, poste ich ihn mal formatiert:

    //dynarray2.cpp Seite 178
    #include <iostream>
    using namespace std;
    
    // hier steht nur die Definition
    int* renew( int* old, int sizeold, int sizenew )
    {
     //Größeren Speicher allozieren
     int* tmp = new int [sizenew];
    
     //Alten Inhalt nach tmp kopieren
     for( int i=0; i<sizeold; i++)
     {
      tmp[i] = old[i];
     }
     //Alten Inhalt löschen
     delete [] old;
     //Neues Array zurückgeben
     return tmp;
    }
    
    int main(void)
    {
     int *dynarray = new int[10];
     for( int i=0; i<10; i++)
     {
      dynarray[i] = i;
     }
     //Array vergrößern auf 15. Elemente
     dynarray=renew(dynarray,10,15);
     for( int i=10; i<15; i++)
     {
      dynarray[i] = i;
     }
     for( int i=0; i<15; i++)
     {
      cout << dynarray[i] << '\n';
     }
     cin.get();
     return 0;
    }
    

    Ahh, ja. Tatsächlich ein echter Wolf, wie man ihn kennt. 🙂 Man möchte schon fast meinen, er macht das mit Absicht und trollt die C++-Welt.



  • jaa das Buch ist echt nicht das beste ^^. Werd mir Weinachten das Buch c++ Primer zulegen. Hoffe das es besser ist als mein jetziges.



  • Zum Thema Buch kann ich dir noch das hier empfehlen:
    Der C++ Programmierer von Ulrich Breymann
    Der C++ Programmierer

    Bin selber erst seit gut 1-2 Monaten dabei und kann sagen, es ist wirklich gut und verständlich be/geschrieben. Hat in diesem Forum bisher nur positive Rückmeldungen erhalten. 🙂
    Aber Primer soll wohl auch gut sein, liegt bei dir 😃



  • Ich will Herrn Breymann nicht zu nahe treten, aber mit dem C++ Primer mitzuhalten, ist nicht ganz einfach. Dessen Autoren sind bei der Sprachentwicklung ja von Anfang an dabei gewesen -- das einzige, womit man noch näher an die Quelle kommt, ist das hier.



  • Keksman schrieb:

    in meinem Buch "C++ von A bis Z" steht [...]

    Oha. Habe nichts gutes von diesem Buch gehört...

    Keksman schrieb:

    auf Seite 99 steht geschrieben ,dass man eine Funktion zuerst deklarieren und definieren muss um sie nacher aufzurufen.

    Das ist nicht ganz korrekt formuliert. Eine Funktion muss vorher mindestens deklariert sein, damit man sie innerhalb einer Übersetzungseinheit nutzen kann. Eine Definition ist allerdings gleichzeitig eine Deklaration. Nochmal zur Erinnerung:

    void foo(); // Das ist eine Deklaration, _keine_ Definition
    
    void foo() { // Das ist eine Definition (aber auch eine Deklaration)
      .....
    }
    

    Deklarieren darfst du so oft du willst. Beim Definieren sieht das anders aus. Hierfür haben wir die ODR (one definition rule), die sich aber nicht in einem Satz erklären lässt. Man sollte das in einem schlauen Buch ruhig mal gelesen haben, den Abschnitt, weil er auch auf solche Dinge wie Templates und inline-Funktionen eingeht und es eigentlich ein ganzer Haufen von Regeln ist.



  • Meint ihr das das Buch c++ Primer vierte Auflage gut zum lernen ist obwohl es ja eigentlich schon veraltet ist ? Oder sollte ich lieber Der c++ Programmierer nehmen ? Rein gefühlsmäßig würde ich mich eher Der c++ Programmierer nehmen da dieses Buch aktueller und dem Leser auch Aufgaben stellt die er zu erledigen hat , bevor er fortschreitet. (jedenfalls hab ich das so verstanden). Danke übrigens das ihr mich aufmerksam darauf gemacht habt das dieses Buch shit ist. 🙂 Ich hätte mit dem Buch wohl einfach weiterprogrammiert.


  • Mod

    Keksman schrieb:

    Meint ihr das das Buch c++ Primer vierte Auflage gut zum lernen ist obwohl es ja eigentlich schon veraltet ist ?

    Ja. Die Neuerungen in C++11 sind nicht so gravierend, die werden selbst in einem aktuellen Anfängerbuch bloß eine Randnotiz sein.


Log in to reply