【发布时间】:2021-04-29 09:25:55
【问题描述】:
我的代码中有这个开关,它占用了大量空间。有没有办法把它变成更小的代码块?
switch(datatype)
{
case OSMP_BYTE: // char
{
datatypeSize = sizeof(char);
break;
}
case OSMP_INT: // int
{
datatypeSize = sizeof(int);
break;
}
case OSMP_SHORT: // short int
{
datatypeSize = sizeof(short int);
break;
}
case OSMP_LONG: // long int
{
datatypeSize = sizeof(long int);
break;
}
case OSMP_UNSIGNED_CHAR: // unsigned char
{
datatypeSize = sizeof(unsigned char);
break;
}
case OSMP_UNSIGNED: // unsigned int
{
datatypeSize = sizeof(unsigned int);
break;
}
case OSMP_UNSIGNED_LONG: // unsigned long int
{
datatypeSize = sizeof(unsigned long int);
break;
}
case OSMP_FLOAT: // float
{
datatypeSize = sizeof(float);
break;
}
case OSMP_DOUBLE: // double
{
datatypeSize = sizeof(double);
break;
}
default:
break;
}
我的数据类型是这样定义的:
typedef enum {
OSMP_SHORT = 1,
OSMP_INT,
OSMP_LONG,
OSMP_UNSIGNED_CHAR,
OSMP_UNSIGNED,
OSMP_UNSIGNED_LONG,
OSMP_FLOAT,
OSMP_DOUBLE,
OSMP_BYTE
} OSMP_Datatype;
如果有办法让它更小,更适合我的代码,我真的会得到帮助。
【问题讨论】:
-
当然,查找表。问题是你调用了多少次?最后真的很重要吗?您可以通过将其作为一个函数来最小化代码,而只需
return sizeof(...),避免所有break垃圾。然后你可以将每个定义写成一行。 -
您可以将开关的每个
case:写在一行以节省空间,例如case OSMP_BYTE: datatypeSize = sizeof(char); break;-- 由你决定。查找表是另一个不错的选择。 -
你在设计什么系统?这些枚举代表什么?您是否对数据进行任何其他操作?
-
你可以去掉花括号,你可以使用 X-macros 来压缩 case 子句:例如
CASE(UNSIGNED_CHAR, unsigned char);where#define CASE(E, T) case OSMP_##E: datatypeSize = sizeof(T); break-- 不过我同意第一条评论质疑紧凑和/或易于编辑的重要性。因为看起来您不太可能添加其他类型的负载或显着修改它们。通常,最不晦涩的代码是最好的代码。但是稍微整理一下,因为你的太冗长了。 -
我正在设计一个使用共享内存传递操作系统消息的库
标签: c switch-statement