C联盟成员访问和未定义的行为
我目前正在开展一个项目,其中提供了以下内容
结构法.我的工作是C,但该项目同时使用C和C.结构相同 定义由C和C使用. typedef struct PacketHeader { //Byte 0 uint8_t bRes :4; uint8_t bEmpty :1; uint8_t bWait :1; uint8_t bErr :1; uint8_t bEnable :1; //Byte 1 uint8_t bInst :4; uint8_t bCount :3; uint8_t bRres :1; //Bytes 2,3 union { uint16_t wId; /* Needed for Endian swapping */ struct{ uint16_t wMake :4; uint16_t wMod :12; }; }; } PacketHeader; 取决于结构的实例的使用方式,所需的字节顺序 //Returns a constructed instance of PacketHeader with relevant fields set and the provided counter value PacketHeader myHeader = mmt::BuildPacketHeader(count); uint16_t packetIdFlipped; //Swap positions of byte 2 and 3 packetIdFlipped = myHeader.wId << 8; packetIdFlipped |= (uint16_t)myHeader.wId >> 8; myHeader.wId = packetIdFlipped; 函数BuildPacketHeader(uint8_t)为成员wMake和赋值 诸如此类的问题 链接草案第10.4节中的第1段也包含以下注释,但我不确定我是否理解所使用的所有术语:
正在读取packetIdFlipped = myHeader.wId<<行中的myHeader.wId 8未定义的行为? 未命名的结构是活动成员,因为它是函数调用中写入的最后一个成员吗? 或者注释是否意味着访问wId成员是安全的,因为它和struct共享一个共同的类型? (这是普通初始序列的意思吗?) 提前致谢 解决方法
是的,这是UB.这并不意味着它不起作用,只是它可能不起作用.您可以在BuildPacketHeader中使用memcpy来避免这种情况(参见this和this). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |