2013-05-30 33 views
1

C中未命名位域的用法是什麼?
C中沒有變量名的位域

例子:

typedef struct fun { 
unsigned int     :8; 
unsigned int foo1   :1; 
unsigned int foo2   :1; 
unsigned int foo3   :1; 
unsigned int foo4   :1; 
unsigned int foo5   :1; 
}dig; 

什麼用線:

unsigned int     :8; 
+0

要在開頭預留8位以用於未來擴展?你真的不得不問問作者爲什麼把它放在那裏,我們所能做的只是猜測。 –

回答

5

這就是所謂的未命名位字段。關於它和可能的使用C11標準狀態:

6.7.2.1結構和聯合SPECI音響ERS

甲比特音響場聲明與沒有聲明,但只有一個冒號 和寬度,指示一個未命名的比特音響場。 106)作爲一個特殊的情況,一個寬度爲0的位域結構成員表示沒有其他位域被打包到前一個 位域(如果有)被放置的單元中。

106)一個未命名的位字段結構成員對於填充符合外部施加的佈局非常有用。

+0

因此,如果有8個命名位域變量(foo [0-7]:1),這意味着它們正在分配8(未命名)+8(8位命名位域)位存儲器? – ted

+0

是的。基本上在開始時分配(或保留)額外的位。 –

0

這樣的未註冊位域可以用於許多原因。如前所述,其中一個原因是爲了填充其他值以匹配存在未使用值的外部佈局。我已經看到它使用這種方式直接映射到硬件上。

他們也可以不用命名爲將來的擴展

雖然你可以給一個名稱,以表明它是未使用它可能是有人使用您所提供的字段設置這些位並沒有將其命名爲你做用戶跳過箍環來設置位。你也結了unnamed1unnamed2等分散你的位域

比如在我使用有位專門爲調試器使用,通過不給它們命名這讓他們更難開發人員將它們設置一個微處理器無意的。

問題出在以前的版本上,他們被命名,同事使用它們。更新編譯器和頭文件並不再編譯代碼