不明确的位字段语句

Ambiguous bit-field statement

本文关键字:语句 字段 不明确      更新时间:2023-10-16

下面的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;
};

请注意,位字段不能用于可靠地指定对象布局,因为它们表示的许多方面都是实现定义的。