?
このドキュメントでは、 php中國語ネットマニュアル リリース
聯(lián)合是由存儲重疊的成員序列組成的類型(與結(jié)構(gòu)相對,結(jié)構(gòu)是一種由存儲按有序序列分配的成員序列組成的類型)。至多一個成員的價值可以在任何時候存儲在工會中。
struct
除了使用的關(guān)鍵字之外,聯(lián)合的類型說明符與 類型說明符相同:
聯(lián)合體名稱(可選){結(jié)構(gòu)聲明列表} | (1) | |
---|---|---|
工會名稱 | (2) |
name | - | 正在定義的聯(lián)盟的名稱 |
---|---|---|
結(jié)構(gòu)聲明列表 | - | 任何數(shù)量的變量聲明,位域聲明和靜態(tài)斷言聲明。不完整類型的成員和函數(shù)類型的成員是不允許的。 |
工會的規(guī)模只有持有其最大成員所需的那么大(另外還可以添加未命名的追尾填充)。其他成員以相同字節(jié)分配,作為該最大成員的一部分。
指向聯(lián)合的指針可以轉(zhuǎn)換為指向其每個成員的指針(如果聯(lián)合有位字段成員,指向聯(lián)合的指針可以轉(zhuǎn)換為指向位字段的基礎(chǔ)類型的指針)。同樣,可以將指向任何聯(lián)合成員的指針轉(zhuǎn)換為指向包圍聯(lián)合的指針。
如果用于訪問聯(lián)合的內(nèi)容的成員與上次用于存儲值的成員不相同,則存儲的值的對象表示將被重新解釋為新類型的對象表示(這稱為類型打孔)。如果新類型的大小大于最后寫入類型的大小,則超出字節(jié)的內(nèi)容未指定(并且可能是陷阱表示)。
與struct類似,類型為無名稱的聯(lián)合的聯(lián)合的未命名成員稱為匿名聯(lián)合。匿名聯(lián)盟的每個成員都被認(rèn)為是封閉結(jié)構(gòu)或聯(lián)盟的成員。如果封閉的結(jié)構(gòu)或聯(lián)合也是匿名的,則這將遞歸應(yīng)用。struct v {union {//匿名聯(lián)合結(jié)構(gòu){int i,j; }; //匿名結(jié)構(gòu)struct {long k,l; } w; }; int m; } v1; v1.i = 2; //有效v1.k = 3; //無效:內(nèi)部結(jié)構(gòu)不是匿名的v1.wk = 5; // valid類似于struct,如果union沒有任何命名成員(包括通過匿名嵌套結(jié)構(gòu)或聯(lián)合獲得的)定義,則程序的行為是未定義的。 | (自C11以來) |
---|
union
.
有關(guān)結(jié)構(gòu)和聯(lián)合初始化的規(guī)則,請參閱結(jié)構(gòu)初始化。
#include <stdio.h>#include <stdint.h>#include <assert.h> int main(void){ union S { uint32_t u32; uint16_t u16[2]; uint8_t u8; } s = {0x12345678}; // s.u32 is now the active member printf("Union S has size %zu and holds %x\n", sizeof s, s.u32); s.u16[0] = 0x0011; // s.u16 is now the active member // reading from s.u32 or from s.u8 reinterprets the object representation// printf("s.u8 is now %x\n", s.u8); // unspecified, typically 11 or 00// printf("s.u32 is now %x\n", s.u32); // unspecified, typically 12340011 or 00115678 // pointers to all members of a union compare equal to themselves and the union assert((uint8_t*)&s == &s.u8); // this union has 3 bytes of trailing padding union pad { char c[5]; // occupies 5 bytes float f; // occupies 4 bytes, imposes alignment 4 } p = {.f = 1.23}; // the size is 8 to satisfy float's alignment printf("size of union of char[5] and float is %zu\n", sizeof p);}
輸出:
Union S has size 4 and holds 12345678size of union of char[5] and float is 8
每個成員都被分配好像它是唯一的成員,這就是為什么s.c
在上面的例子中第一個字節(jié)是別名s.s[0]
。
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
6.7.2.1結(jié)構(gòu)和聯(lián)合說明符(p:112-117)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
6.7.2.1結(jié)構(gòu)和聯(lián)合說明符(p:101-104)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
3.5.2.1結(jié)構(gòu)和聯(lián)合說明符