Если вам нужно решение portable , вы можете посмотреть макросы C11 generi c, эквивалентные бедному C программисту полиморфизму C ++: -)
Следующая программа показывает как вы можете его использовать:
#include <stdio.h>
#define Output(buff, sz, T) _Generic((T), \
char *: OutputS, \
double: OutputD, \
int: OutputI \
)(buff, sz, T)
void OutputS(char *buff, size_t sz, char *s) { snprintf(buff, sz, "S %s", s); }
void OutputD(char *buff, size_t sz, double d) { snprintf(buff, sz, "D %f", d); }
void OutputI(char *buff, size_t sz, int i) { snprintf(buff, sz, "I %d", i); }
int main() {
char buff[100];
Output(buff, sizeof(buff), "hello"); puts(buff);
Output(buff, sizeof(buff), 5); puts(buff);
Output(buff, sizeof(buff), 3.14159); puts(buff);
}
Вы видите, что правильная функция вызывается в зависимости от типа данных:
S hello
I 5
D 3.141590