在 C 函数中传递数据类型信息
Passing data type information in C function
我正在实现一个队列数据结构并使用 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 中的其他机制获取类型信息。
试试这个:
enum Type {
type0 = 0,
type1 = 1,
// and so on
};
struct Node {
void* next;
size_t size;
enum Type type;
};
struct queue {
struct Node* headNode;
};
你的情况不需要任何技巧。无需为任何类型的通用性而烦恼。您正在实现一个存储空指针的队列。空队列将由 NULL 表示。函数 addElement
将向队列添加一个空指针。就这些。实现可能如下所示:
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;
}
基本上你不能。 C 中没有 "type" 变量类型允许您使用类型说明符标记内存区域然后恢复它。
一般不需要。你知道队列是一个整数队列,或者结构雇员,只需在调用代码中转换 void * 即可。仅当队列需要一组混合成员时才会出现问题。
最好的方法是在代表类型的队列节点结构中添加一个字符串。然后在字符串上执行 if ... else 阶梯并转换为正确的类型。它不是特别有效,但它使二进制数据 human-readable。然而,很少有队列是这样的。
我正在实现一个队列数据结构并使用 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 中的其他机制获取类型信息。
试试这个:
enum Type {
type0 = 0,
type1 = 1,
// and so on
};
struct Node {
void* next;
size_t size;
enum Type type;
};
struct queue {
struct Node* headNode;
};
你的情况不需要任何技巧。无需为任何类型的通用性而烦恼。您正在实现一个存储空指针的队列。空队列将由 NULL 表示。函数 addElement
将向队列添加一个空指针。就这些。实现可能如下所示:
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;
}
基本上你不能。 C 中没有 "type" 变量类型允许您使用类型说明符标记内存区域然后恢复它。
一般不需要。你知道队列是一个整数队列,或者结构雇员,只需在调用代码中转换 void * 即可。仅当队列需要一组混合成员时才会出现问题。
最好的方法是在代表类型的队列节点结构中添加一个字符串。然后在字符串上执行 if ... else 阶梯并转换为正确的类型。它不是特别有效,但它使二进制数据 human-readable。然而,很少有队列是这样的。