【问题标题】:getting the name of a typedef in C? [duplicate]在 C 中获取 typedef 的名称? [复制]
【发布时间】:2014-05-27 12:39:36
【问题描述】:

我正在编写一个大代码,我必须对很多结构进行 typedef,然后使用指向这些结构的变量的 void 指针,例如:

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

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

human_t peter = {
    21,
    1.95 };

然后我将创建一个指向 peter 的 void 指针:

void* ptr = &peter;

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

【问题讨论】:

  • 除非您自己将此信息存储在某处,否则您无法执行此操作。通常,C 中没有隐藏的东西。如果您有 void*,那就是 全部
  • 不太相关,但请注意 _t 后缀是为 posix 类型保留的

标签: c pointers struct typedef void


【解决方案1】:

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

它需要运行时类型信息以某种方式与指针相关联,而这根本不存在。 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 ... */
  }
}

例如,您还可以将类型信息放在映射中,根据指针值散列。

有很多方法;您将不得不分析并为您的特定应用选择最佳的。

【讨论】:

    【解决方案2】:

    唉,这在 C 中并不容易实现。

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

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

    【讨论】:

    • 竖起大拇指猜测我稍后会键入 cast :)
    猜你喜欢
    • 2013-07-17
    • 2016-01-04
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2012-04-22
    • 2014-01-20
    相关资源
    最近更新 更多