Нет, «из коробки» это невозможно.
Это потребовало бы, чтобы информация о типе времени выполнения была каким-то образом связана с указателем, а этого просто не существует. Указатель void
- это адрес памяти и не более того.
Конечно, вы можете, как и многие вещи, существующие на языках более высокого уровня, реализовать это самостоятельно.
В этом случае вы можете потребовать, чтобы каждый поддерживаемый struct
начинался с enum
, указывающего его тип. Затем вы можете преобразовать указатель на структуру в указатель на это перечисление, прочитать его значение, а затем узнать, с каким типом вы имеете дело:
typedef enum {
ObjectType_Human,
ObjectType_Alien,
ObjectType_Predator,
ObjectType_Smurf,
} ObjectType;
typedef struct {
ObjectType type;
int age;
char name[32];
} human;
Тогда вы сможете:
void print_name(const void *obj)
{
const ObjectType *tp = obj; /* No cast required! */
switch(*tp)
{
case ObjectType_Human:
printf("the human is called %s\n", ((human *) obj)->name);
break;
/* and so on ... */
}
}
Вы также можете, например, поместить информацию о типе в карту, хешировав значение указателя.
Есть много подходов; вам нужно будет проанализировать и выбрать лучший для вашего конкретного приложения.
person
unwind
schedule
27.05.2014
void*
, это все, что у вас есть. - person n. 1.8e9-where's-my-share m.   schedule 27.05.2014_t
зарезервирован для типов posix - person David Ranieri   schedule 27.05.2014