Newbie hat Fragen



  • also ich arbeite grad ein Buch zum Thema C++ durch, soweit so...

    naja ich bin dabei wie ihr euch denken könnt über Fragen gestolpert:
    1.) inline... 😕
    wann ist die Verwendung empfehlenswert, oder ist inline gar nicht empfehlenswert???
    2.) Die Präprozessormakros... 😕
    Dasselbe in grün: Wann sollte man die benutzen und wenn gar nicht warum hat sich niemand die Mühe gemacht das komplett rauszunehmen???
    3.) Wo schreibe ich Funktionen am besten hin... 😕
    Vor, oder hinter main???

    also wenn sich jemand die Mühe macht mir zu antworten wär cool und dann bitte nicht sone Antworten wie ja/ja/nein, sonder ich würd gern verstehen warum dass dann so ist, allet klar 😉 ?

    mfg und danke im voraus
    Δερ νερδ



  • Hi,

    erstmal vorweg: Was ich sage, ist ziemlich subjektiv.

    N.E.R.D. schrieb:

    ...
    1.) inline... 😕
    wann ist die Verwendung empfehlenswert, oder ist inline gar nicht empfehlenswert??? ...

    Solange Du "normale Programme" schreibst, kannst/solltest Du das getrost weglassen - verwirrt nur und macht in 99% der Fälle nicht das, was Du denkst.
    Erst da, wo man sehr gezielt für einen bestimmten Compiler/Plattform/Programm optimiert, kann man das vereinzelt und geprüft sinnvoll einsetzen.

    N.E.R.D. schrieb:

    ...
    2.) Die Präprozessormakros... 😕
    Dasselbe in grün: Wann sollte man die benutzen und wenn gar nicht warum hat sich niemand die Mühe gemacht das komplett rauszunehmen???...

    Makros sind "historisch gewachsen" aus C (und C ist eine ziemlich alte Sprache). Inzwischen gibt es für die allermeisten Fälle bessere (=übersichtlichere/fehler-unanfälligere) Lösungen.
    Wenn man tatsächlich Makros "verbieten" würde, gäbe es Millionen von Programmen, die nicht mehr funktionieren/umgeschrieben werden müssten.
    Außerdem sind C und C++ Sprachen, in denen man zwar alles an die Hand bekommt, um gut zu programmieren, .... in denen man aber nicht automatisch verboten bekommt, schlecht zu programmieren.

    N.E.R.D. schrieb:

    ...
    3.) Wo schreibe ich Funktionen am besten hin... 😕
    Vor, oder hinter main???...

    Das bleibt letztlich Dir überlassen und dem, was Du für übersichtlicher hältst.
    Allerdings muss jede Funktion vor ihrem Aufruf "angekündigt" (also zumindestens mit einer "forward declaration"/"prototypen" dem Compiler bekannt gemacht) werden.
    Sobald man "ein wenig mehr" programmiert, wird sowieso die Unterteilung Module notwendig....

    Gruß,

    Simon2.


  • Administrator

    Wenn ich da ein paar Ergänzungen zum Beitrag von Simon2 machen darf:

    1. inline hat nichts mit optimieren zu tun. Vom Standard her gibt es keine Garantie, dass eine Funktion inline aufgerufen wird, wenn das Schlüsselwort inline vor ihr steht. inline wird nur dafür genutzt, damit Funktionsdefinitionen in Headern nicht zu Mehrfachdefinitionen führt.
    // X.hpp
    
    inline void foo()
    {
      // whatever
    }
    
    // A.cpp
    
    #include "X.hpp"
    
    // B.cpp
    
    #include "X.hpp"
    

    Wenn foo nicht als inline angegeben worden wäre, dann wäre eine Mehrfachdefinition vorhanden gewesen. Eine Defintion in A.cpp und eine in B.cpp .

    1. Makros sind nicht einfach nur schlecht. Man sollte sie allerdings mit bedacht benutzen und es zuerst über alle anderen Wege probieren. Im allgemeinen sollte man Makros meiden, es gibt aber Fälle wo sie entweder unumgänglich sind oder sogar einen unglaublichen Nutzen bringen.
      Unumgänglich sind sie zum Beispiel bei Header-Guards, was vor mehrfachem inkludieren schützt:
    #ifndef MYHEADERNAME_HEADER_GUARD_HASH_WHATEVER
    #define MYHEADERNAME_HEADER_GUARD_HASH_WHATEVER
    
    // Was man alles im Header haben möchte ...
    
    #endif
    

    Einen unglaublichen Nutzen bringen sie zum Beispiel in der Codegenerierung. Wenn man oft sehr ähnlichen Code hat, nur mit z.B. anderen Namen, kann man Makros verwenden, um sich diesen Code einfach erstellen zu lassen, was einem dann Tipparbeit erspart. Ein Beispiel dafür, kann man in diesem Artikel finden:
    http://magazin.c-plusplus.net/artikel/Benutzerdefinierte Manipulatoren
    Kapitel 3 und 4.

    3. Am besten teilt man die Funktionen in Gruppen auf und erstellt dann für die Deklaration ein Headerfile (z.B. *.hpp ) und für die Definition ein Implementationsfile (z.B. *.cpp ).
    Die main setzt man dann in eine main.cpp und inkludiert die entsprechenden Headerfiles, welche man benötigt.
    Also weder davor noch danach, sondern man linkt 😉

    Grüssli


Anmelden zum Antworten