Spezielle Makros mit Parameterübergabe



  • Hallo allerseits,
    ich habe gelesen, dass es spezielle Makros mit Parameterübergabe gibt z.B.:

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

    mir ist jedoch nicht klar der sinn für so einen Textersatz



  • Irgendwie ist MAX(x, y) kürzer als (x > y ? x : y) oder? 😉

    EDIT: Textersatz deshalb, um einen Funktionsaufruf zu sparen. Das sollten moderne Compiler und Bibliotheken aber inzwischen auch über Inlining hinbekommen.



  • solche makros sind mit Vorsicht zu genießen.
    Der Aufruf MAX(++a, ++b) würde zu (++a) > (++b) ? (++a) : (++b) aufgelöst werden, was dazu führen würde, dass das größere element zweimal inkrementiert wird, was fast nie im Sinne des Erfinders ist.
    Inline-Funktionen sind in fast alen Fällen zu bevorzugen.



  • Heinzelotto schrieb:

    solche makros sind mit Vorsicht zu genießen.
    Der Aufruf MAX(++a, ++b) würde zu (++a) > (++b) ? (++a) : (++b) aufgelöst werden, was dazu führen würde, dass das größere element zweimal inkrementiert wird, was fast nie im Sinne des Erfinders ist.

    kannst ihm ja das ++ verbieten:

    #define MAX2(a,b) ((*&(a))>(*&(b)) ? (a):(b))
    

    🙂


  • Mod

    -fricky- schrieb:

    Heinzelotto schrieb:

    solche makros sind mit Vorsicht zu genießen.
    Der Aufruf MAX(++a, ++b) würde zu (++a) > (++b) ? (++a) : (++b) aufgelöst werden, was dazu führen würde, dass das größere element zweimal inkrementiert wird, was fast nie im Sinne des Erfinders ist.

    kannst ihm ja das ++ verbieten:

    #define MAX2(a,b) ((*&(a))>(*&(b)) ? (a):(b))
    

    🙂

    👎
    Offensichtlich hat frickys Code nicht den behaupteten Effekt.



  • Hallo,
    danke für die schnelle Antwor. Also so eine Benutzung ist nicht emfehlenswert und könnte vermieden dur Verwendung z.B. einer Inline Funktion. leider sagt mir dies wenig heißt es dass Funktiondefinition in einer linie ist?



  • camper schrieb:

    Offensichtlich hat frickys Code nicht den behaupteten Effekt.

    stimmt, ++ davor geht noch. nur dahinter nicht. das makro ist mir nicht so ganz gelungen.
    🙂


  • Mod

    -fricky- schrieb:

    camper schrieb:

    Offensichtlich hat frickys Code nicht den behaupteten Effekt.

    stimmt, ++ davor geht noch. nur dahinter nicht. das makro ist mir nicht so ganz gelungen.
    🙂

    Wichtiger ist, dass an der falschen Stelle ansetzt.

    int x = max(finde_wert(datenbank1,suchkriterium1),finde_wert(datenbank2,suchkriterium2));
    

    hat keine lokal relevanten Seiteneffekte, aber konzeptionell handelt es sich um teure Operationen, die wir nicht unnötig wiederholen sollten. Natürlich könntest du immer gerne 100000 zusätzliche lokale Variablen anlegen...



  • ^^ man müsste den makroargumenten nur ihre lvalue-eigenschaft abgewöhnen. damit könnte man das makro 'absichern'. aber eigentlich lohnt es sich nicht, weiter darüber nachzudenken. der mündige c-coder kennt seine makros und weiss um ihre tücken.
    🙂



  • myouness27 schrieb:

    Hallo,
    danke für die schnelle Antwor. Also so eine Benutzung ist nicht emfehlenswert und könnte vermieden dur Verwendung z.B. einer Inline Funktion. leider sagt mir dies wenig heißt es dass Funktiondefinition in einer linie ist?

    http://en.wikipedia.org/wiki/Inline_function


Anmelden zum Antworten