在C函数中传递数据类型信息

时间:2017-02-07 07:03:55

标签: c data-structures generic-programming

我正在实现一个队列数据结构,并使用void *指针使其成为通用的。但我仍然坚持这一点,至于如何在C中传递数据类型信息以获取特定数据类型的队列,就像我们在C ++中有模板一样。

  typedef struct queue{void * data;
      struct queue * link;
  }Queue; 

  Queue * getQueue(pass the type){
      Queue * head = (Queue *)malloc(sizeof(Queue));
      //cast by type the data of queue and return created queue node.
      return head;
  }

使用C的malloc()函数创建的队列。上面的代码创建了队列的头部。然后其他函数将在插入请求上创建后续节点。

这是错误的,但我应该如何传递数据类型信息以使其正确投射,或者我是否必须使用_Generic宏,或者是否有设施通过C中的其他机制获取类型信息。

3 个答案:

答案 0 :(得分:2)

基本上你不能。 C中没有“类型”变量类型,允许您使用类型说明符标记内存区域,然后将其恢复。

通常不需要。您知道队列是整数或结构雇员的队列,只是在调用代码中强制转换void *。只有当队列需要一组混合成员时才会出现问题。

最好的方法是在表示类型的队列节点结构中添加一个字符串。然后在字符串上执行if ... else梯形图并转换为正确的类型。它不是特别有效,但它使二进制数据具有人类可读性。然而,很少有队列是这样的。

答案 1 :(得分:1)

试试这个:

android:supportsRtl="false"

答案 2 :(得分:1)

在你的情况下不需要任何技巧。无需担心任何类型的通用性。您正在实现存储void指针的队列。空队列将由NULL表示。函数addElement将添加一个指向队列的void指针。就这些。实现可能如下所示:

typedef struct queue {
  void * data;
  struct queue * link;
} Queue; 

Queue * getQueue() {return(NULL);}

void addElement(Queue **qq, void *data) {
  // find last ptr
  for(; *qq != NULL; qq = &((*qq)->link) ) ;
  *qq = malloc(sizeof(Queue));
  (*qq)->data = data;
  (*qq)->link = NULL;
}