在单个函数中初始化具有相同成员名称和成员数的多个结构

时间:2019-01-27 18:13:19

标签: c structure generic-programming void-pointers

typedef struct
{
 int data;
int size;
} s1;

typedef struct
{
 char data;
 int size;
} s2;

typedef struct
{
 float data;
 char size;
} s3;

func(void *p)
{
      /*this should be generic to all structure.*/
      /* Need to do for removing duplicate codes*/
      /* p->data=1; p->size=0; this should be generic */
}
 int main()
{ s1 a;s2 b; s3 c;
   func(a);func(b);func(c);
 }

这里需要初始化这个结构是随机的。 要求是将“ func”保留为所有结构类型的通用功能。

请建议使用C而不是C ++的最佳方法

2 个答案:

答案 0 :(得分:0)

处理所有这三种类型的单个函数将不起作用,因为每个成员的大小和类型都不同,即使名称相同。

例如,假设每个字节的data字段中都存储值1,则假定float具有大字节序排列和IEEE 754单精度表示:

a.data
---------------------
| 00 | 00 | 00 | 01 |
---------------------

b.data
------
| 01 |
------

c.data
---------------------
| 3f | 80 | 00 | 00 |
---------------------

因此,在不了解实际类型的情况下,无法完全执行您要查找的内容。

与您想要的最接近的是为每种类型创建一个函数,然后使用带有_Generic的宏来包装要调用的函数。

void func_s1(s1 *p)
{
    ...
}

void func_s2(s2 *p)
{
    ...
}

void func_s3(s3 *p)
{
    ...
}

#define func(p) _Generic((p), \
                         s1: func_s1, \
                         s2: func_s2, \
                         s3: func_s3)(&p)

答案 1 :(得分:0)

.tl-timemarker-content-container {
    background-color:#cc0000 !important;
}