使用 GNU GCC 4.7.0+,我收到了一些严格的别名警告,我想解决这些问题。
我有一个有效载荷(来自硬件):
unsigned char payload[davidlt::PAYLOAD_SIZE];
我有这条线:
*(uint32_t*)(payload + davidlt::DATA_OFFSET) = (pid & davidlt::PID_MASK) << davidlt::PID_SHIFT;
这将创建一个指向有效负载中特定位置的指针,并且 4 个字节被解释为uint32_t
. uint32_t
在有效负载中计算和替换新的值类型。
我得到:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
我希望通过使用来解决它reinterpret_cast
,但我得到了同样的警告。
*reinterpret_cast<uint32_t *>(payload + davidlt::DATA_OFFSET) = (pid & davidlt::PID_MASK) << davidlt::PID_SHIFT;
据我了解,您可以将任何数据转换为char
or unsigned char
,这是允许的,但这仅适用于一种方式。
一种解决方案是制作一个union
. 难道没有其他方法可以创建对unsigned char
数据的不同类型的引用吗?
谢谢!大卫