Попытка перегрузки функции на языке программирования C
C11 не имеет никакой перегрузки функции и _Generic
для универсальность , не для перегрузки, проверьте это, прочитав n1570 . Рассмотрите возможность перехода на C ++ (или, что еще лучше, Rust ), который обеспечивает перегрузку функций. Обратите внимание, что нельзя иметь аргумент void
(не void*
, просто void
) для функции C, поэтому в C не существует супертипа "top" , который бы быть супертипом других типов (и это из-за соглашений о вызовах и ABI из соображений, делающих C низкоуровневый язык программирования, иногда даже называемый " портативный сборщик "). Подробнее о абстрактной интерпретации и системах типов пожалуйста.
Если бы _Generic
был из-за перегрузки, члены комитета по стандарту C11 - все эксперты по языку программирования и достаточно хорошие английские писатели - назвали бы его как _Overload
, но они мудро не сделали.
Пища для размышлений (при условии, что stderr
и stdin
работают так, как вы хотите, чтобы они работали) :
как насчет гипотетического display(stderr)
или display(*stdin)
или display("abc")
?
(неправильное предложение ниже, а затем совет лучшего качества)
плохой подход
( это не работает! )
Ваш display_void
должен принять аргумент, например,
void display_void(void*p) { printf("p@%p\n", p);
Тогда у вас может быть:
#define display_anything(P) display_void((void*)(&(P)))
с
#define display(x) _Generic((x), \
float: display_float, \
int: display_int, \
default: display_anything \
)(x)
лучший совет
Поскольку это не работает (и не работает), создайте свой код другим способом . Например, рассмотрим наличие тегового объединения , например здесь . Изучите реализацию GVariant (из Glib) для вдохновения.