如何给含位域的结构体数组输入数据?cannot bind bitfield报错原因
「error: cannot bind bitfield」编译错误原因与解决
错误触发点
你给出的代码中,编译报错出在cin >> a[0].p;这一行,cout << a[0].p;本身不会触发该错误。
根本原因
- 位域是C/C++中为了节省内存设计的语法,你定义的
struct ex中p和m都是宽度为14位的位域,二者会被编译器打包存储在同一个32位int存储单元中,位域成员没有独立的、可直接寻址的内存地址。 - C++标准明确规定:非const类型的左值引用不允许直接绑定到位域成员。
cin的>>运算符针对int类型的重载版本,参数类型是int&(非const左值引用),需要拿到目标变量的可写内存地址才能把输入的值写入,位域不满足这个要求,因此编译失败。- 而
cout输出位域时,是将位域的值拷贝为临时int值传参,不需要绑定引用到位域本身的内存,所以不会报错。
解决方法
方法1:临时变量中转(推荐)
输入时先把值读到普通临时变量中,再赋值给位域成员,示例代码:
#include<iostream> using std::cin; using std::cout; short n, i, m; struct ex { int p: 14; int m: 14; } a[10005]; int main() { int temp; cin >> temp; a[0].p = temp; cout << a[0].p; return 0; }
方法2:取消位域定义
如果只是练习语法不需要严格控制内存占用,可以把位域成员改成普通int成员,拥有独立内存地址后就可以直接绑定引用:
struct ex { int p; int m; } a[10005];
补充说明
const左值引用是可以绑定位域的,编译器会自动生成临时对象存储位域的值再完成绑定,但这种绑定是只读的,无法通过引用修改位域内容,因此不适用于需要写入值的输入场景。
内容的提问来源于stack exchange,提问作者Trương Quang Vinh
相关产品推荐
相关产品推荐

