5 ms·
That is really cool. Combine this with struct definitions in function bodies and I see a great teamup with variadic functions. Take a theoretical struct_print
by codehero 12y ago
That is really cool.
Combine this with struct definitions in function bodies and I see a great teamup with variadic functions.
Take a theoretical struct_printf, which prints out non promoted data with struct packing (not variadic stack packing, which requires type promotion)
/* Only uses va_start and va_arg to*/
void struct_printf(const char* format, ...){
...
}
void print_foo(){
struct foo_t{
float f;
uint16_t u2;
uint8_t x;
} input;
struct_printf("No type promotion here: %f %hu %hhx\n",
(struct foo_t){ .f = 0.1, .u2 = 1000, .x = 0xF2});
}
Now we can actually pass what we mean to pass without the compiler changing it.
NOTE: After I wrote this I'm not actually sure what va_args does with a struct or how to get a pointer to the first member...
- nitrogen 12y agoNOTE: After I wrote this I'm not actually sure what va_args does with a struct or how to get a pointer to the first member... I think you would still need to know the exact type inside of struct_printf(), unless you knew exactly how the compiler would pack a struct onto the stack or registers, and that it was exactly the same as individual parameters.
- Peaker 12y agoNote, %hu and %hhx are not portable ways to print uint16_t and uint8_t. Instead, you're supposed to #include <inttypes.h> and use: "No type promotion here: %f %"PRIu16" %"PRIx8"\n"