我们使用位域来表示从设备读取的寄存器元素。
#include <cstdint>
struct Register {
uint8_t field : 1;
};
int main() {
uint8_t byte{0}; // Read from a device
Register r;
r.field = (byte >> 5) & 0x1; // access bit 5
r.field = (byte >> 7) & 0x1; // access bit 7, warns
}
我们也使用旗帜,
-Werror=conversion
。由于某种原因,访问位 0 到 6 会在没有警告的情况下进行编译。但是,访问位 7 会发出转换警告 error: conversion from 'unsigned char' to 'unsigned char:1' may change value [-Werror=conversion]
。
有什么想法吗?或者如何以不会警告转换错误的方式纠正它?
您收到 1 个警告而不是 2 个或 0 个警告,这确实很奇怪。
但是既然您询问如何删除警告,请将值转换为
bool
。
r.field = ((byte >> 7) & 0x1) != 0; // access bit 7
或
r.field = bool((byte >> 7) & 0x1); // access bit 7