Возможно, это не лучшее использование перегрузки на основе типов (будь то на основе __builtin_choose_expr
или стандартизированной _Generic
), но вот пример, который показывает, что ваш код работает с uint32_t *data
и uint32_t
len.Код компилируется:
#include <stdint.h>
#include <stdio.h>
//prototypes
void dataioWriteBin_uint8Data_uint64Len(FILE *f, uint8_t const *data, uint64_t len);
void dataioWriteBin_uint8Data_uint32Len(FILE *f, uint8_t const *data, uint32_t len);
void dataioWriteBin_uint32Data_uint64Len(FILE *f, uint32_t const *data, uint64_t len);
void dataioWriteBin_uint32Data_uint32Len(FILE *f, uint32_t const *data, uint32_t len);
//
#define dataioWriteBin(file, data, len) \
(__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint8_t ) && __builtin_types_compatible_p(typeof(len), uint64_t ), dataioWriteBin_uint8Data_uint64Len, \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint8_t ) && __builtin_types_compatible_p(typeof(len), uint32_t ), dataioWriteBin_uint8Data_uint32Len, \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint32_t ) && __builtin_types_compatible_p(typeof(len), uint64_t ), dataioWriteBin_uint32Data_uint64Len, \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(*data), uint32_t ) && __builtin_types_compatible_p(typeof(len), uint32_t ), dataioWriteBin_uint32Data_uint32Len, \
(void)0))))(file, data, len))
//
void use_it(void)
{
uint32_t data[4]={};
dataioWriteBin(stdout,data,(uint32_t)sizeof(data));
}