如何修改我的代码以避免左移警告?
How do I rework my code to avoid left shift warning?
我有这个方法 read
用于从无符号字符指针 data
的地址读取整数数据类型。例如,如果 data
包含 0x12, 0x34, 0x56, 0x78, 0x9A
,则 read<int>(1, ptrToMyInt)
应将 0x3456789A
放入 ptrToMyInt
。
示例:
class MyClass {
public:
MyClass();
template <typename T> void read(int address, T *dest) {
size_t size = sizeof(T);
*dest = 0;
for (unsigned int i = 0; i < size; i++) {
*dest <<= 8;
*dest |= data[address + i];
}
}
static constexpr unsigned char data[] = { 0x12, 0x34, 0x56, 0x78 };
}
当我在 unsigned char 指针上使用此模板时(为了保持一致性,避免使用多个读取方法),它会发出警告,因为 *dest <<= 8;
行的偏移量超过了一个字节的宽度,并且编译器不够聪明,无法意识到它只在字节已经为 0 时发生一次。
例如:
MyClass c;
unsigned char x;
c.read(2, &x); // warning: shift count >= width of type
// should and does put 0x56 into x
我想重新编写此代码以避免出现此警告,但我看不到 simple/elegant 重写它的方法。我该如何重写这段代码?
使用 C++17,你可能会这样做
template <typename T> void read(int address, T *dest) {
constexpr size_t size = sizeof(T);
if constexpr (size == 1)
{
*dest = data[address];
} else {
*dest = 0;
for (unsigned int i = 0; i < size; i++) {
*dest <<= 8;
*dest |= data[address + i];
}
}
}
我有这个方法 read
用于从无符号字符指针 data
的地址读取整数数据类型。例如,如果 data
包含 0x12, 0x34, 0x56, 0x78, 0x9A
,则 read<int>(1, ptrToMyInt)
应将 0x3456789A
放入 ptrToMyInt
。
示例:
class MyClass {
public:
MyClass();
template <typename T> void read(int address, T *dest) {
size_t size = sizeof(T);
*dest = 0;
for (unsigned int i = 0; i < size; i++) {
*dest <<= 8;
*dest |= data[address + i];
}
}
static constexpr unsigned char data[] = { 0x12, 0x34, 0x56, 0x78 };
}
当我在 unsigned char 指针上使用此模板时(为了保持一致性,避免使用多个读取方法),它会发出警告,因为 *dest <<= 8;
行的偏移量超过了一个字节的宽度,并且编译器不够聪明,无法意识到它只在字节已经为 0 时发生一次。
例如:
MyClass c;
unsigned char x;
c.read(2, &x); // warning: shift count >= width of type
// should and does put 0x56 into x
我想重新编写此代码以避免出现此警告,但我看不到 simple/elegant 重写它的方法。我该如何重写这段代码?
使用 C++17,你可能会这样做
template <typename T> void read(int address, T *dest) {
constexpr size_t size = sizeof(T);
if constexpr (size == 1)
{
*dest = data[address];
} else {
*dest = 0;
for (unsigned int i = 0; i < size; i++) {
*dest <<= 8;
*dest |= data[address + i];
}
}
}