c++ 位字段和 -Wconversion
c++ bit fields and -Wconversion
当我
使用 g++ 为位字段赋值时,-Wconversion
会产生警告。
源文件:
struct Foo
{
public:
unsigned int x : 4;
unsigned int y : 9;
unsigned int z : 17;
};
int main(int, char**)
{
int a = 12;
Foo f;
f.x = a;
f.x = (unsigned int)a;
f.x = (unsigned char)a;
f.x = (unsigned short)a;
f.x = (unsigned)a;
f.y = a;
f.y = (unsigned int)a;
f.y = (unsigned char)a; // no warning, sizeof(char) < 9
f.y = (unsigned short)a;
f.y = (unsigned)a;
f.z = a;
f.z = (unsigned int)a;
f.z = (unsigned char)a; // no warning, sizeof(char) < 17
f.z = (unsigned short)a; // no warning, sizeof(char) < 17
f.z = (unsigned)a;
}
编译输出:
$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
<snip>
$ g++ -Wconversion test.cpp
test.cpp: In function ‘int main(int, char**)’:
test.cpp:13:8: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:14:22: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:15:23: warning: conversion to ‘unsigned char:4’ from ‘unsigned char’ may alter its value [-Wconversion]
test.cpp:16:24: warning: conversion to ‘unsigned char:4’ from ‘short unsigned int’ may alter its value [-Wconversion]
test.cpp:17:18: warning: conversion to ‘unsigned char:4’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:19:8: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:20:22: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:22:24: warning: conversion to ‘short unsigned int:9’ from ‘short unsigned int’ may alter its value [-Wconversion]
test.cpp:23:18: warning: conversion to ‘short unsigned int:9’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:25:8: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:26:22: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion]
test.cpp:29:18: warning: conversion to ‘unsigned int:17’ from ‘unsigned int’ may alter its value [-Wconversion]
我希望为项目的其他部分(包括在此文件中)启用-Wconversion
。 如何"修复"此处的赋值语句,以免收到警告?
确保转换不会溢出。这是一种方法:
struct Foo
{
public:
unsigned int x : 4;
unsigned int y : 9;
unsigned int z : 17;
};
int main(int, char**)
{
int a = 12;
Foo f;
f.x = static_cast<unsigned int>(a & 15);
f.y = static_cast<unsigned int>(a & 511);
f.z = static_cast<unsigned int>(a & 131071);
}
Wconversion 会在每次您的隐式转换可能会改变您的值时发出警告。话虽如此,你的代码没有问题。
使用上面提到的static_cast<usigned_int>
可以解决您的问题。
更多信息
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何避免在数据结构中包含存储为字段的类?
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- c++ 位字段和 -Wconversion