不明确的位字段语句
Ambiguous bit-field statement
下面的Note
对我来说似乎是ambiguous
[在C++书中找到]。
可以声明一个未命名的Bit-Field
来创建填充,以实现特定的对象布局。
作者想从上面的笔记中传达什么?
我尝试了以下程序来理解,但仍然不清楚。
class s
{
public:
unsigned i:1;
};
int main()
{
s x;
x.i=1;
cout<<x.i<<endl; //outputs 1
return 0;
}
程序如何在不发出任何警告或错误的情况下完美运行?
我正在使用 ideone[ C++ (gcc-4.3.4)
] : http://ideone.com/bLLz4
但是,如果我从声明中删除unsigned
,它会给出错误:
prog.cpp:7: error: ISO C++ forbids declaration of ‘i’ with no type
另一个问题
class s
{
public:
int i:1;
};
int main()
{
s x;
x.i=1;
cout<<x.i<<endl; //outputs -1
return 0;
}
输出-1
是否取决于机器架构["字节序"]?
输出如何来自 -1?
http://ideone.com/XWbak
顾名思义,未命名的位字段是没有名称的字段。您的unsigned i:1;
不是未命名的;它的名字是 i
.名称是可选的;类型不是。
C 标准(我将引用 N1570)在 6.7.2.1p12 中说:
没有声明符,只有冒号和 宽度,表示未命名的位域。作为特例,位域 宽度为 0 的结构成员表示没有进一步的位字段 将被打包到前一个位域(如果有)所在的单元中, 被放置。
例如:
struct foo {
unsigned int x:1;
unsigned int :0;
unsigned int y:1;
};
请注意,位字段不能用于可靠地指定对象布局,因为它们表示的许多方面都是实现定义的。
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 不明确的位字段语句
- 我如何让一个输入语句重复,直到用户选择的字段数完成
- QODBCResult::exec: 无法执行语句:"[Microsoft][ODBC SQL Server Driver]COUNT 字段不正确或语法错误