c - Why does this define macro perform a cast? -
i have function-like macro takes in enum return code , function call.
#define handle_call(result,call) \ { \ result callresult = call; \ result* resultvar = (result*)result; \ // additional processing (*resultvar) = callresult; \ } while(0) does fancy pointer casting result* , subsequent de-referencing gain anything? is, there advantage doing on just:
callresult = call; // additional processing *result = callresult; the macro used this:
result result; handle_call(&result,some_function()); by way, isn't code , i'm not power c user i'm trying understand if there logic behind doing this.
i think gives you, user of macro can pass in pointer of old type, not result*. i'd either way, or if wanted allow (for example) void* macro argument i'd write *(result*)(result) = callresult;.
there's thing might be, depending rest of macro looks like. "some additional processing" mention resultvar @ all, or line (*resultvar) = callresult; conditional? if so, resultvar exists in order ensure macro evaluates each of arguments exactly once, , therefore behaves more function call if evaluated them other number of times (including zero).
so, if call in loop handle_call(output++, *input++) vaguely predictable. @ least, provided output result* macro author intended. i'm still not sure cast gives you, other allowing different argument types void* or char*.
there situations make difference whether have cast or not. example, consider:
typedef double result; int foo() { return 1; } int i; handle_call(&i, foo()); if typedef double result; isn't visible on screen, other 3 lines appear pretty innocuous. what's wrong assigning int int, right? once macro expanded, bad stuff happens when cast int* double*. cast, bad stuff undefined behavior, double bigger int , overruns memory i. if you're lucky, you'll compiler warning "strict aliasing".
without cast can't double* resultvar = &i;, original macro change catches error , rejects code, instead of doing nasty. version *result = callresult; works, provided double can accurately represent every value of int. ieee double , int smaller 53 bits, can.
presumably result struct, , nobody write code give above. think serves example why macros end being more fiddly think.
Comments
Post a Comment