0

以下Noteambiguous私には[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

4

1 に答える 1

2

名前のないビット フィールドは、その名前が示すように、名前のないものです。あなたunsigned i:1;は無名ではありません。その名はi。名前はオプションです。タイプではありません。

C標準(N1570を引用します)は、6.7.2.1p12で次のように述べています。

宣言子がなく、コロンと幅のみのビットフィールド宣言は、名前のないビットフィールドを示します。特殊なケースとして、幅が 0 のビットフィールド構造体メンバーは、以前のビットフィールドが配置されていたユニットにそれ以上ビットフィールドをパックしないことを示します。

例えば:

struct foo {
    unsigned int x:1;
    unsigned int  :0;
    unsigned int y:1;
};

オブジェクトのレイアウトを確実に指定するためにビット フィールドを使用できないことに注意してください。これは、ビット フィールドの表現の多くの側面が実装定義であるためです。

于 2012-06-25T06:39:26.333 に答える