Welche Vorteile bieten Inline Funktionen gegenüber Makros ??



  • ..... schrieb:

    Macro fail.

    Wie schön das du kaputte Macros für einne Vergleich heranziehst. Dieses Beispiel zeigt nur, dass ein Noob leicht fehlerhafte Macros schreiben kann.



  • Janjan schrieb:

    ..... schrieb:

    Macro fail.

    Wie schön das du kaputte Macros für einne Vergleich heranziehst. Dieses Beispiel zeigt nur, dass ein Noob leicht fehlerhafte Macros schreiben kann.

    Ich bin mir des Fehlers bewusst (Fehlende Klammerung). Ich wollte nur vor dem leichtfertigem Gebrauch warnen. Und das ist mir ja anscheinden gelungen 🤡



  • Makros liegen auch immer im global scope und lassen sich nicht in Namespaces einbetten. Wurde bisher noch nicht erwähnt, glaube ich.



  • asc schrieb:

    // Ungetestet:
    #define MAX(a, b) a > b ? a : b
    
    int main()
    {
      int a = MAX(1, 2);
      int b = MAX(++a, 3); => Teste mal was heraus kommt... (Tip: 3 ist es nicht)
    }
    

    hmm...
    Mein Compiler sagt aber 3 🙄

    Aber schon klar, dass du ++a zweimal ausgeführt haben wolltest 😉

    z.B.

    #define MAX(a, b) a >= b ? a : b
    


  • CSpille schrieb:

    Mein Compiler sagt aber 3 🙄

    Gratuliere! Du hast so eben "undefined behaviour" entdeckt! Dies kann sich von Compiler zu Compiler unterscheiden.

    CSpille schrieb:

    #define MAX(a, b) a >= b ? a : b
    

    Immernoch kaputt.



  • Janjan schrieb:

    CSpille schrieb:

    Mein Compiler sagt aber 3 🙄

    Gratuliere! Du hast so eben "undefined behaviour" entdeckt! Dies kann sich von Compiler zu Compiler unterscheiden.

    CSpille schrieb:

    #define MAX(a, b) a >= b ? a : b
    

    Immernoch kaputt.

    Vielen Dank Janjan!

    Dass

    std::cout << (++a >= b ? ++a : b) << std::endl;
    

    undefiniertes Verhalten verursacht, ist mir auch klar...

    Die Intention von asc, war es aber wohl zu zeigen, dass dort (bei den meisten Compilern?)
    wegen einfacher Textersetzung 4 rauskommt, ansonsten habe ich seinen Beitrag fehlinterpretiert.



  • CSpille schrieb:

    Dass
    std::cout << (++a >= b ? ++a : b) << std::endl;
    undefiniertes Verhalten verursacht, ist mir auch klar...

    Da irrt ihr Euch (Du und Janjan). Das Verhalten ist hier wohldefiniert. Der ternäre Operator garantiert eine Ordnung. Das Fragezeichen ist sozusagen ein Sequenzpunkt. Was links davon steht, wird komplett ausgewertet (inklusive Erhöhen von a) bevor genau ein Teil der rechten Seite ausgewertet wird.

    Ähnliche Garantien gibt es bei && , || und dem Sequenzoperator , -- sofern es sich nicht um benutzerdefinierte Funktionen (überladene Operatoren) handelt.

    kk



  • Inline Funktionen benötigen weniger Zeit für call und return

    Inline ist ein Hinweis, es gibt keine Garantien. Auch hat inline genug Nachteile. Z.B. zerstoert Kapselnung, weil im Header definiert.



  • CSpille schrieb:

    asc schrieb:

    // Ungetestet:
    #define MAX(a, b) a > b ? a : b
    
    int main()
    {
      int a = MAX(1, 2);
      int b = MAX(++a, 3); => Teste mal was heraus kommt... (Tip: 3 ist es nicht)
    }
    

    hmm...
    Mein Compiler sagt aber 3 🙄

    Genau das ist auch zu erwarten.

    kk



  • knivil schrieb:

    Inline ist ein Hinweis, es gibt keine Garantien. Auch hat inline genug Nachteile. Z.B. zerstoert Kapselnung, weil im Header definiert.

    Ging es nicht um den Vergleich inline-Funktion <-> Makro? Gegenüber Makros bieten inline-Funktionen keine Nachteile bzgl Kapselung, oder? Ist doch eher umgekehrt.

    kk



  • krümelkacker schrieb:

    CSpille schrieb:

    Dass
    std::cout << (++a >= b ? ++a : b) << std::endl;
    undefiniertes Verhalten verursacht, ist mir auch klar...

    Da irrt ihr Euch (Du und Janjan). Das Verhalten ist hier wohldefiniert. Der ternäre Operator garantiert eine Ordnung. Das Fragezeichen ist sozusagen ein Sequenzpunkt. Was links davon steht, wird komplett ausgewertet (inklusive Erhöhen von a) bevor genau ein Teil der rechten Seite ausgewertet wird.

    Ähnliche Garantien gibt es bei && , || und dem Sequenzoperator , -- sofern es sich nicht um benutzerdefinierte Funktionen (überladene Operatoren) handelt.

    kk

    Cool...
    Das ist wirklich ne neue Info

    thx,
    krümelkacker



  • krümelkacker schrieb:

    Ging es nicht um den Vergleich inline-Funktion <-> Makro? Gegenüber Makros bieten inline-Funktionen keine Nachteile bzgl Kapselung, oder? Ist doch eher umgekehrt.

    Naja, man kann jetzt einen niedrigen Standard ansetzen, z.B. Makros, und sagen wie toll ich doch demgegenueber bin. Das macht es nicht sinnvoller. Das ist Kritik an der Frage, nicht an den Antworten.


Anmelden zum Antworten