首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二义性位字段语句

二义性位字段语句
EN

Stack Overflow用户
提问于 2012-06-25 06:09:58
回答 1查看 227关注 0票数 0

下面的Note似乎是ambiguous在C++的一本书中找到的。

可以声明未命名的Bit-Field 来创建填充,以实现特定的对象布局.。

作者想从上面的笔记中表达什么?

我尝试了以下程序来理解,但仍然不清楚。

代码语言:javascript
复制
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,则会出现以下错误:

代码语言:javascript
复制
prog.cpp:7: error: ISO C++ forbids declaration of ‘i’ with no type   

另一个问题

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-25 06:39:26

顾名思义,未命名位字段是一个没有名称的字段。您的unsigned i:1;不是未命名的;它的名称是i。名称是可选的;类型不是。

C标准(我将引用N1570)在6.7.2.1p12中写道:

没有声明符但只有冒号和宽度的位字段声明表示未命名的位字段.作为特例,宽度为0的位字段结构成员表示不再将位字段打包到前一个位字段(如果有的话)所在的单元中。

例如:

代码语言:javascript
复制
struct foo {
    unsigned int x:1;
    unsigned int  :0;
    unsigned int y:1;
};

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11184201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档