11

次のコードは、正常に正常に終了することが保証されていますか?

#include <assert.h>

struct foo_s {
    union {
        struct {
            unsigned a : 10;
            unsigned   : 6;
        };
        struct {
            unsigned   : 10;
            unsigned b : 6;
        };
        struct {
            unsigned   : 10;
            unsigned c : 6;
        };
    };
};

int main () {
    struct foo_s f;
    f.a = 0;
    f.b = 1;
    assert(f.a == 0);
    return 0;
}

別の質問に答えているときに、名前のないビットフィールドも含む構造体の名前付きビットフィールドへの代入により、任意のデータがそれらのビットに書き込まれる可能性が提起されました。C.11 §6.7.2.1 ¶12 には次のように記載されています。

宣言子がなく、コロンと幅のみのビットフィールド宣言は、名前のないビットフィールドを示します。

これについての私の解釈は、名前のないビットフィールドは単なる通常のビットフィールドであり、唯一の違いは、これらのビットの値を名前で直接取得できないことです。「as-if」ロジックを使用してそれから外挿し、それらのビットに任意のデータを割り当てることが実装で許可されていますか?

4

1 に答える 1

5

はい、実装によって名前のないビット フィールドに任意のビットが書き込まれる可能性があると思います。脚注 126 は、幅が 0 より大きい名前のないビットフィールドが導入された理由を単に述べているだけだと思います。

名前のないビットフィールド構造体メンバーは、パディングを外部から課されたレイアウトに適合させるのに役立ちます。

したがって、基本的に名前のないビットフィールドは、パディング ビットと同じセマンティクスを持ちます。その内容に頼ることはできません。

隣接する名前付きビットフィールドに書き込むときに、基本的に名前のないビットフィールドを無視できる実装を許可するとa、そのフィールドの処理が大幅に容易になりますa。名前のないフィールドの現在の値を読み取る必要はなく、書き込みはアトミックに一度に行うことができます。構造体に含まれるビットのパディングと同様です。

于 2013-09-06T06:49:59.527 に答える