在C中获取typedef的名称?

时间:2014-05-27 12:39:36

标签: c pointers struct typedef void

我正在编写一个很大的代码,我需要输入很多结构,然后使用void指针来表示这些结构的变量,例如:

typedef struct {
    int age;
    double height;
}human_t;

然后我将声明并初始化一个类型的变量:" human_t"

human_t peter = {
    21,
    1.95 };

然后我将制作一个指向彼得的空指针:

void* ptr = &peter;

我后来需要知道的是" ptr"是指向" human_t"类型的变量的指针。我怎样才能做到这一点 ?在C中有某种预定义的方法吗?对不起我的无知:)还是初学者。

2 个答案:

答案 0 :(得分:4)

不,这是不可能的“开箱即用”。

它需要运行时类型信息以某种方式与指针相关联,而这根本就不存在。 void指针是一个内存地址,仅此而已。

当然,与高级语言中存在的许多内容一样,您可以自己实现它。

对于这种情况,您可以要求每个受支持的struct都以指定其类型的enum开头。然后,您可以将指向struct的指针转换为指向该枚举的指针,读取其值,然后知道您正在处理的是哪种类型:

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 ... */
  }
}
例如,您也可以将类型信息放在地图中,并在指针值上进行哈希处理。

有很多方法;你将不得不分析并选择最适合你特定应用的那个。

答案 1 :(得分:2)

唉,这在C中实施起来并不容易。

一种方法是标准化您的结构,以便第一个元素是一个类型字段。

C标准保证结构的地址始终与第一个元素的地址对齐(即在第一个结构成员之前没有填充)。因此,首先将void*转换为类型字段是安全的,并根据该结果投射到您选择的结构。