如何将void *转换为通用结构类型,其名称因传递的TYPE类型而不同?

时间:2015-03-13 20:30:40

标签: c c-preprocessor void-pointers generic-collections

我试图模拟"模板" C 中的样式行为,作为将代码从cpp重构为C的练习的一部分。 我通过像这样定义结构来构建 MACRO方法

#define FIFO(TYPE, depth, NAME)                                     \
     typedef struct fifo_##TYPE##NAME                               \
     {                                                              \
        TYPE array[depth];                                          \
        uint8 st_idx;                                               \
        uint8 end_idx;                                              \
        uint32 cnt;                                               \
     }fifo_##TYPE##NAME;                                            \
     void fifo_##TYPE##NAME_init(fifo_##TYPE##NAME *f);             \
     int fifo_##TYPE##NAME_push(fifo_##TYPE##NAME *f, TYPE *elem);  \
     TYPE* fifo_##TYPE##NAME_pop(fifo_##TYPE##NAME *f);             \
     TYPE* fifo_##TYPE##NAME_peek(fifo_##TYPE##NAME *f);            \

然后我为上面显示的原型定义了MACRO函数。 与模板方法相比,这实际上增加了我的代码大小,因为每个TYPE都定义了每个函数。

我现在尝试使用 void * 方法而不是MACRO。我仍然使用上面的MACRO结构定义,但我没有定义MACRO功能。我在.h文件中使用普通的内联函数,但我仍然坚持如何通过void * ptr访问泛型TYPE结构的成员。我可以将它投入哪种类型?如果结构的名称按TYPE更改,我没有明确的结构类型将其强制转换为。此外,MACRO不会在非宏功能中工作。

对于这个措辞感到抱歉! 感谢。

0 个答案:

没有答案