是否可以为联合创建数据类型 getter用 C 语言?

问题描述

我有一个指向联合的指针数组:

typedef union element
{
  float f; 
  int i;
  long l;
  char c;
  char *s; 
} element;

typedef struct Array
{

  int capacity;
  int original_capacity;
  int count;
  element *elements;
} Array;

我的代码有效,没有错误!我可以附加到数组或在索引处插入它,很快我就能做更多的事情。我还可以使用 arr_print 函数打印出整个数组:

int main(void){
  Array *arr = create_array(7);
  arr_print(arr);
  arr_append(arr,new_element_s("String 1"));
  arr_print(arr);

  arr_insert(arr,new_element_s("String2"),0);
  arr_insert(arr,new_element_s("add"),0);
  arr_print(arr);
}

控制台:

Array count 3 and capacity 7
[add,String2,String 1]

问题是我只能在联合是单一类型的情况下打印出整个数组,并且我希望能够扩展此功能

这是 arr_print 函数

void arr_print(Array *arr)
{
  printf("Array count %d and capacity %d\n",arr->count,arr->capacity);
  printf("[");
  for (int i = 0; i < arr->count; i++) // 
  {
    printf("%s",arr->elements[i].s); // SEG FAULT IF MISMATCHED.

    if (i != arr->count - 1)
    {
      printf(",");
    }
  }
  printf("]\n");
}

如果类型不匹配,printf 会导致段错误

例如,如果我添加这些行:

  arr_insert(arr,new_element_c('a'),1);
  arr_insert(arr,new_element_i(1),1);
  arr_print(arr); // This breaks

我收到段错误,因为 char 或 int 不是 %s

所以,我正在寻找某种方法来告诉联合包含的数据类型(然后使用开关或其他东西)。在伪代码中,我可能会做这样的事情

// typeof(arr->elements[i].data) == 'string' ? printf("%s",arr->elements[i].data)
// typeof(arr->elements[i].data) == 'int' ? printf("%d",arr->elements[i].data)

如果没有本地方式,是否有我可以编写的函数可以解析数据/推断它是什么,或者是否有一些库可以做到这一点?或者这只是你应该知道的事情?我想我可以用一个告诉类型的字段为联合制作一个结构包装器,但如果我不需要,我不想这样做。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)