下面的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;
}程序如何在没有任何警告或错误的情况下完美地工作?
我正在使用ideoneC++ (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 是否依赖于机器体系结构‘’Endianness‘?
输出是如何来的-1?
http://ideone.com/XWbak
发布于 2012-06-25 06:39:26
顾名思义,未命名位字段是一个没有名称的字段。您的unsigned i:1;不是未命名的;它的名称是i。名称是可选的;类型不是。
C标准(我将引用N1570)在6.7.2.1p12中写道:
没有声明符但只有冒号和宽度的位字段声明表示未命名的位字段.作为特例,宽度为0的位字段结构成员表示不再将位字段打包到前一个位字段(如果有的话)所在的单元中。
例如:
struct foo {
unsigned int x:1;
unsigned int :0;
unsigned int y:1;
};注意,位字段不能用于可靠地指定对象布局,因为其表示的许多方面都是实现定义的。
https://stackoverflow.com/questions/11184201
复制相似问题