It's simulated cleverly using a macro that wraps variable arguments in a struct literal: See the definition of http_set_cookie in https://github.com/boazsegev/facil.io/blob/master/lib/facil/...
It's simulated cleverly using a macro that wraps variable arguments in a struct literal: See the definition of http_set_cookie in https://github.com/boazsegev/facil.io/blob/master/lib/facil/...
If you like this, the book has some other tricks in it you might also like. (One example: you can define generic functions in C11).
I've seen people try to simulate this in C++ with tags.
Of course, the first comment on HN has the answer.
I am going to try this trick out today.
https://github.com/boazsegev/facil.io/blob/master/lib/facil/...
I've seen other hacks to do this, but this is the cleanest that I've seen. He uses the same name for the macro and the function.
The only thing I would change is the way the struct is passed. I would pass by reference.
I really like this.
Interesting. I expected taking the address of a struct literal to be illegal, but GCC and Clang both accept it. It does make sense, I guess.
But may I ask why you would pass it by reference? With old ABIs, the struct would be passed on the stack (i.e., by reference) anyway, and with more recent ones, a small prefix would be in registers but the rest passed by reference as well. So why bother manually cluttering the code?
Also if you set a struct with {1} the first field is set to 1 and the rest to 0. AFAIR it was always like that (at least since standardized C, but probably earlier).