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



我正在实现一个队列数据结构,并使用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 中的其他机制获取类型信息的工具。

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

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

最好的方法是将字符串添加到表示类型的队列节点结构中。然后做一个如果...否则梯子在绳子上并铸造到正确的类型。它不是特别有效,但它使二进制数据可读。然而,很少有队列是这样的。

在你的情况下不需要任何技巧。无需为任何类型的通用性而烦恼。您正在实现一个存储 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;
}

试试这个:

enum Type {
    type0 = 0,
    type1 = 1,
    // and so on
};
struct Node {
    void* next;
    size_t size;
    enum Type type;
};
struct queue {
    struct Node* headNode;
};

相关内容

最新更新