c - 对于不同类型的 var,如何重复使用变量而不出现错误 C2371(重新定义)?

标签 c unions

在 VBA 中,我只需使用变体类型来实现此目的,但如何减少这种有些重复的代码以获得更好的 switch case block ?

switch(command){
case CMD1:
    RESPONSE1 rsp1;
    memcpy(&rsp1,pPkt,sizeof(rsp1));
    break;
case CMD2:
    RESPONSE2 rsp2;
    memcpy(&rsp2,pPkt,sizeof(rsp2));
    break;
case CMD3:
    RESPONSE3 rsp3;
    memcpy(&rsp3,pPkt,sizeof(rsp3));
    break;
case CMD4:
    RESPONSE4 rsp4;
    memcpy(&rsp4,pPkt,sizeof(rsp4));
case CMD5:
    RESPONSE5 rsp5;
    memcpy(&rsp5,pPkt,sizeof(rsp5));
default:
    break;
}

我的目标是消除这 5 个响应变量并仅使用一个 - 但是,由于 memcpy,我需要 5 种不同的类型。

我知道,有类似 cast 的东西,但我认为这更有问题,因为这些 RESPONSE# 是不同大小的结构 - 我不需要为此重新分配内存吗?

编辑:

多亏了 mux,我发现我的代码中已经有一个 union (改编自其他人的东西)!

typedef union
{
  RESPONSE1 rsp1;
  RESPONSE2 rsp2;
  RESPONSE3 rsp3;
  RESPONSE4 rsp4;
  RESPONSE5 rsp5;
}
RESPONSE_UNION;

这就是我现在使用的:

RESPONSE_UNION ru;

switch(command){
    case CMD1:
        memcpy(&ru.rsp1,pPkt,sizeof(ru.rsp1));
        break;
    case CMD2:
        memcpy(&ru.rsp2,pPkt,sizeof(ru.rsp2));
        break;
...

真的很有帮助!

最佳答案

您可以使用union,并且您可能还想为响应类型定义一个enum:

typedef enum { 
    RESPONSE_1,
    RESPONSE_2,
    RESPONSE_3,
    RESPONSE_4
} ResponseType;

typedef struct {    
    ResponseType type;
    union {
        RESPONSE1 rsp1;
        RESPONSE2 rsp2;
        RESPONSE3 rsp3;
        RESPONSE4 rsp4;
    };
} Response;

在您的代码中,您可以这样使用它:

Response r;
switch (command) {
    case CMD1:
        r.type = RESPONSE_1;
        memcpy(&r.rsp1, pPkt, sizeof(r.resp1));
        break;
    case CMD2:
    ...
}

关于c - 对于不同类型的 var,如何重复使用变量而不出现错误 C2371(重新定义)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13569139/

相关文章:

c - gcc 是否自动将静态变量初始化为零?

c - 错误: too few arguments to function 'set_new_node'

c++ - while(n--) 和 while(n=n-1) 有什么区别?

C++ - 与非平凡类成员类型的 union ?

c - 为什么静态变量不执行 ‘add’指令?

c - 如何在 C 中使用 calloc()?

c - Arduino:union/struct 属性返回错误值

java - Thrift Java 客户端无法正确处理 union

C enum 打印错误?

c 如何 union 让你将数据视为一个字节数组