1. 重新认识enum类型
C语言中,enum类型可以用来定义常量,且可以自动累加变量值,在方便程度上,易于使用宏定义。因此,enum类型在较多场景中使用。
使用方式如下:
typedef enum
{
UART_MSG_CMD_OPEN =0,
UART_MSG_CMD_CLOSE,
UART_MSG_CMD_START,
UART_MSG_CMD_STOP,
UART_MSG_CMD_MAX
}eUARTMSGCMD;
2. 问题
但以往对于enum类型变量内存分配空间没有概念,最近在修改MISRA问题中遇到此问题。
是enum类型变量强制转换为uint_16类型好,还是uint_16类型变量强制转换为enum类型变量好?
也就是文章标题所说的问题,类型强制转换,默认的原则,是向上转换,也就是在内存空间够用的情况下,尽量使用大类型变量,以减少精度损失。
换言之,enum类型变量,uint_16类型变量,哪种类型变量占用内存空间大?
我们做如下实验
int main(void)
{
unsigned short iMsgId;
iMsgId = 11;
eUARTMSGCMD eMessageId = (eUARTMSGCMD)iMsgId;
eUARTMSGCMD eMessageIdMax = UART_MSG_CMD_MAX;
printf("eMessageId:%d, eMessageMax: %d\n", eMessageId, eMessageIdMax);
printf("sizeof(eUARTMSGCMD):%lu, sizeof(unsigned short): %lu\n", sizeof(eUARTMSGCMD), sizeof(unsigned short));
return 0;
}
程序编译,运行。结果如下:
root@localhost:~/testWorkSpace/enum$ cmake --build build/
Scanning dependencies of target enum
[ 50%] Building CXX object CMakeFiles/enum.dir/main.cpp.o
[100%] Linking CXX executable enum
[100%] Built target enum
root@localhost:~/testWorkSpace/enum$ ./build/
CMakeFiles/ enum
root@localhost:~/testWorkSpace/enum$ ./build/enum
eMessageId:11, eMessageMax: 4
sizeof(eUARTMSGCMD):4, sizeof(unsigned short): 2
运行结果说明,enum类型的变量占用地址空间为4个字节,uint_16强制转换为enum类型变量较妥。