C ++位字段和-Wconversion [英] c++ bit fields and -Wconversion
本文介绍了C ++位字段和-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 = 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
.如何在此处修复"分配语句,以免收到警告?
I want -Wconversion
enabled for other parts of my project (including within this file). How do I "fix" the assignment statements here so I don't get warnings?
推荐答案
确保转换不会溢出.这是一种方法:
Ensure the conversion can't overflow. Here's one way:
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);
}
这篇关于C ++位字段和-Wconversion的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文