да, void *
отлично подходит для создания универсальных функций.Однако, как только вы передадите указатель на определенный тип данных в функцию, которая принимает void *
, вы потеряете всю информацию о типе.Один из способов управлять вашей программой, чтобы она знала, какой тип вы передали, - это иметь второй параметр типа enum
, который может иметь такие значения, как INT, FLOAT, DOUBLE и т. Д. И т. Д.
#include <stdio.h>
typedef enum inputTypes
{
INT,
DOUBLE,
CHAR
} inType;
void myfunc(void*, inType);
int main(void)
{
int i = 42;
double d = 3.14;
char c = 'a';
myfunc(&i, INT);
myfunc(&d, DOUBLE);
myfunc(&c, CHAR);
return 0;
}
void myfunc(void* param, inType type)
{
switch(type) {
case INT:
printf("you passed in int %d\n", *((int *)param));
break;
case DOUBLE:
printf("you passed in double %lf\n", *((double *)param));
break;
case CHAR:
printf("you passed in char %c\n", *((char *)param));
break;
}
}
Выход
you passed in int 42
you passed in double 3.140000
you passed in char a