gpt4 book ai didi

c - 重构:非常相似的 switch cases

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:56 28 4
gpt4 key购买 nike

我声明了几个包含不同数据的struct。我还有一个对应于这些结构的 enum。我的代码中有几个地方需要访问有关结构的信息,我是通过枚举来完成的。这导致很少有 switch 语句返回此信息。

我已将那些 switch 语句包含在它们自己的函数中,以便尽可能重复使用。这导致了三个看起来非常相似的函数。

示例伪代码:

#include <stdio.h>

typedef struct
{
int varA;
char varB;
} A;

typedef struct
{
int varA;
int varB;
int varC;
} B;

typedef struct
{
int varA;
short varB;
} C;

typedef enum { structA, structB, structC } STRUCT_ENUM;

int returnSize(STRUCT_ENUM structType)
{
int retVal = 0;
switch(structType)
{
case structA:
retVal = sizeof(A);
break;
case structB:
retVal = sizeof(B);
break;
case structC:
retVal = sizeof(C);
break;
default:
break;
}

return retVal;
}

void printStructName(STRUCT_ENUM structType)
{
switch(structType)
{
case structA:
printf("Struct: A\r\n");
break;
case structB:
printf("Struct: B\r\n");
break;
case structC:
printf("Struct: C\r\n");
break;
default:
break;
}
}

void createDataString(STRUCT_ENUM structType, char* output, unsigned char* input)
{
switch(structType)
{
case structA:
{
A a = *(A*)input;
sprintf(output, "data: %d, %d", a.varA, a.varB);
break;
}
case structB:
{
B b = *(B*)input;
sprintf(output, "data: %d, %d, %d", b.varA, b.varB, b.varC);
break;
}
case structC:
{
C c = *(C*)input;
sprintf(output, "data: %d, %d", c.varA, c.varB);
break;
}
default:
break;
}
}

int main(void) {
char foobar[50];

printf("Return size: %d\r\n", returnSize(structA));
printStructName(structB);

C c = { 10, 20 };
createDataString(structC, foobar, (unsigned char*) &c);
printf("Data string: %s\r\n", foobar);

return 0;
}

这些自由函数基本上包含相同的 switch,但在 case 中放置了不同的代码。使用此设置,添加新的结构和枚举值会导致代码中需要更改的三个位置。

问题是:有没有办法将其重构为更易于维护的东西?额外的限制是代码是用 C 语言编写的。

编辑:在线示例:http://ideone.com/xhXmXu

最佳答案

您始终可以使用静态数组并使用 STRUCT_ENUM 作为索引。鉴于您的功能的性质,我真的不知道您是否会认为它更易于维护,但它是我通常更喜欢的替代方案,名称和大小示例:

typedef enum { structA, structB, structC, STRUCT_ENUM_MAX } STRUCT_ENUM;
char *struct_name[STRUCT_ENUM_MAX] = {[structA] = "Struct A", [structB] = "Struct B", [structC] = "Struct C"};
size_t struct_size[STRUCT_ENUM_MAX] = {[structA] = sizeof(A), [structB] = sizeof(B), [structC] = sizeof(C)};

为了打印内容,您可以保留一个类似的接收 void * 的函数数组,它将打印此参数的值。

编辑:根据 Jen Gustedt 的评论添加了指定的初始化器。

关于c - 重构:非常相似的 switch cases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33212456/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com