結構體指定初始化和位初始化

1.結構體指定初始化linux

在閱讀linux2.6內核的時候,遇到這樣一段代碼:函數

static struct platform_device da850_evm_tl_leds_device = {orm

.name = "leds-gpio",編譯器

.id = 1,it

.dev = {io

           .platform_data = &da850_evm_tl_leds_padata編譯

           }form

};變量

能夠看到是左邊 = 右邊的格式,左邊表示platform_device機構體的內的成員變量,右邊表示的具體的賦值函數,指定的賦值某個結構體成員。數據

如定義結構體

struct A{

int a;

int b;

int c;

}B;

賦值能夠指定賦值,如A m={

.b = 3

}

2.結構體位賦值-位段結構體

有的協議並不都是按照字節來賦值的,有的是按照位來賦值,一個字節能夠包含不少個字段,表示多個意思,針對與這種狀況,能夠用位段來處理這樣的協議。

如:

struct A{

   int a:4;

          int    b : 3;

          int    c :1;

}B;

好比一個 unsigned char型數據m = 0xff,而結構體B也爲一個字節,那麼兩個就能夠賦值,結構體成員變量a,b,c按位截取m。

位域的對齊

  若是結構體中含有位域(bit-field),那麼VC中準則是:

  1) 若是相鄰位域字段的類型相同,且其位寬之和小於類型的sizeof大小,則後面的字段將緊鄰前一個字段存儲,直到不能容納爲止;

  2) 若是相鄰位域字段的類型相同,但其位寬之和大於類型的sizeof大小,則後面的字段將重新的存儲單元開始,其偏移量爲其類型大小的整數倍;

  3) 若是相鄰的位域字段的類型不一樣,則各編譯器的具體實現有差別,VC6採起不壓縮方式(不一樣位域字段存放在不一樣的位域類型字節中),Dev-C++和GCC都採起壓縮方式;

  系統會先爲結構體成員按照對齊方式分配空間和填塞(padding),而後對變量進行位域操做。

能夠使用字節對齊,

如:

#pragma pack (1)

struct A{

   int a:4;

          int    b : 3;

          int    c :1;

}B;

#pragma pack ()

親測可用,有時候須要這樣用。

相關文章
相關標籤/搜索