簡體   English   中英

未命名的位域是否具有定義明確的語義?

[英]Do unnamed bit-fields have well-defined semantics?

是否保證以下代碼可以正常成功終止?

#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指出:

沒有聲明符但只有一個冒號和一個寬度的位域聲明表示未命名的位域。

我的理解是,未命名的位域只是常規的位域,唯一的區別是這些位中的值不能直接通過名稱獲得。 是否允許一個實現從使用“假設”邏輯的實現中推斷出來並在這些位中分配任意數據?

是的,我認為一個實現可以將任意位寫入一個未命名的位字段。 我認為腳注126僅說明了為什么引入了寬度大於0的未命名位域的意圖:

未命名的位域結構成員可用於填充以符合外部施加的布局。

因此,基本上未命名的位域具有與填充位相同的語義。 您只是不能依靠它們的內容。

在寫入相鄰命名位字段a時,允許實現方案基本上忽略未命名位字段,從而大大簡化了對該字段a的處理。 無需讀取未命名字段的當前值,並且可以一次完成原子操作。 就像可能包含在結構中的填充位一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM