I am using several similar functions and want to make one overloadable.
The basic function takes 3 parameters, and its successive expansions take 4 or more.
#define register_read_write(action, parameter, reg_value, ...)
_Generic(&(uint32_t[]){__VA_ARGS__},
uint32_t(*)[2]: register_read_write_with_limits,
uint32_t(*)[1]: register_read_write_with_upper_limit)
((action), (parameter), (reg_value), (__VA_ARGS__))
declarations
void register_read_write_with_limits(access_t action, parameter_t parameter, uint16_t *reg_value,
uint32_t value_min, uint32_t value_max);
void register_read_write_with_upper_limit(access_t action, parameter_t parameter, uint16_t *reg_value,
uint32_t value_max);
and it works fine but i can't add a basic function with 3 parameters:
void register_read_write(access_t action, parameter_t parameter, uint16_t *reg_value)
i try:
#define register_read_write(action, parameter, reg_value, ...)
_Generic(&(uint32_t[]){__VA_ARGS__},
uint32_t(*)[2]: register_read_write_with_limits,
uint32_t(*)[1]: register_read_write_with_upper_limit,
uint32_t(*)[0]: register_read_write)
((action), (parameter), (reg_value), (__VA_ARGS__))
but:
error: '_Generic' selector of type 'uint32_t ()[0]' {aka 'long unsigned int ()[0]'} is not compatible with any association #define register_read_write(action, parameter, reg_value, ...) _Generic(&(uint32_t[]){VA_ARGS},
following the blow....
I'm developing my generic functions and ran into another problem.
#define FIRST_ARG(value, ...) (value)
#define generic_uint8_read_write(action, parameter, ...)
_Generic(&(uint32_t[]){(uintptr_t)__VA_ARGS__},
uint32_t(*)[1]: register_uint8_read_write)(action, parameter, __VA_ARGS__)
#define generic_uint16_read_write(action, parameter, ...) _Generic(&(uint32_t[]){(uintptr_t)__VA_ARGS__},
uint32_t(*)[2]: register_read_write_with_limits,
uint32_t(*)[1]: register_read_write_with_upper_limit,
uint32_t(*)[0]: register_read_write)(action, parameter, __VA_ARGS__)
#define generic_read_write(action, parameter, ...)
_Generic(FIRST_ARG(__VA_ARGS__),
uint8_t*: generic_uint8_read_write(action, parameter, __VA_ARGS__),
uint16_t* : generic_uint16_read_write(action, parameter, __VA_ARGS__))
I don't know why, but it doesn't detect pointer type correctly.
i change
#define generic_read_write(action, parameter, value, ...)
_Generic((value),
uint8_t*: generic_uint8_read_write(action, parameter, value, __VA_ARGS__),
uint16_t* : generic_uint16_read_write(action, parameter, value, __VA_ARGS__))
and still failed :-(
Please give me some suggestions.
regards
P.S. I am looking for a good tutorial on how the "_Generic" functionality works.