我在这段代码中有一个编译器警告('type dereferencing type-punned pointer将破坏严格别名规则'):
volatile uint8_t Buff[READ_BUFF_SIZE];
#define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr))
ChunkID = LD_DWORD(&Buff[0]); <-- here is warning
我在32位Cortex M0上。
尽管有警告,但工作正常。我的问题是,警告可以解决吗?
答案 0 :(得分:3)
重新解释没有分配存储持续时间的对象作为其他(不兼容)类型的对象是未定义的行为。
在示例Buff
中,类型uint8_t
具有静态或自动存储持续时间,正在重新解释为类型DWORD
。那些类型不兼容 1 ,行为未定义。
您只需将Buff
定义为您打算使用的类型,即DWORD
:
volatile DWORD Buff[READ_BUFF_SIZE];
然后您不需要访问宏,只需使用内置运算符即可:
ChunkID = Buff[0];
1 即使我们假设 2 uint8_t被定义为unsigned char,它可能是任何类型的别名,类型DWORD
可能不是别名{{1} }。
2 标准允许类型unsigned char
未定义为uint8_t
,即使CHAR_BIT为8.请参阅扩展整数类型。