C 語言中的匿名聯合體和匿名結構體

2021-10-05 10:10:19 字數 1630 閱讀 8311

在 c 語言中,可以在結構體中宣告某個聯合體(或結構體)而不用指出它的名字,如此之後就可以像使用結構體成員一樣直接使用其中聯合體(或結構體)的成員。

#include struct person  

; };  

int main(void)  

};    printf("%d\n", jim.area_code);     

}

如果不使用匿名結構體,則上述例子對應的**如下:

#include struct phone;  

struct person

;

int main(void) };

printf("%d\n", jim.office.area_code);

}

對比上述兩個例子可以看出:

使用匿名結構體,結構體物件 jim 可以通過 jim.area_code 直接訪問匿名結構體成員變數 area_code,**相對比較簡潔

反之則必須通過 jim.office.area_code 來訪問結構體成員變數 

匿名聯合體舉例如下:

#include struct person

;    int      age;}; 

int main(void); 

printf("jim.gender = %c, jim.id = %d\n", jim.gender, jim.id);

return 0;

}

如果不適用匿名聯合體,那麼程式如下:

#include union u; 

struct person; 

int main(void); 

printf("jim.test.gender = %c, jim.test.id = %d\n", jim.test.gender, jim.test.id);

return 0;

}

————————————————

keil也支援匿名結構體、聯合體

#pragma anon_unions

typedef union ;

}kktypedef;

void jjj(void)

//keil中預設是不支援匿名結構體的,需要編譯指令#pragma anon_unions指名。

但是不支援這樣的匿名結構體

#pragma anon_unions

union ;}; 

void jjj(void)

error:  #20: identifier "num" is undefined

error:  #20: identifier "nlow" is undefined

但在iar裡是可以的,有點不一樣。

補充:好像在gcc編譯器中也是可以的。

補充2:在ccs v5.1中使用msp430中不能使用以上兩個結構體,不知道在ccs v5.1中msp430的編譯器是什麼,反正是不支援匿名結構體。

————————————————

匿名聯合體的 妙處

在類內部其實是可以定義一些型別的,比如struct union class,其實也就只有這三類可以被定義,也只有這三類可以定義它們各自的物件,然後 出來或者 出來,c 中只有這三類了。對於它們各自來說,在乙個類的內部都可以有三種方式來定義它們,比如對於union,第一種方式 定義了乙個union型別...

C語言中的聯合體

聯 合 union 1.聯合說明和聯合變數定義 聯合也是一種新的資料型別,它是一種特殊形式的變數。聯合說明和聯合變數定義與結構十分相似。其形式為 union 聯合名 聯合變數名 聯合表示幾個變數公用乙個記憶體位置,在不同的時間儲存不同的資料型別 和不同長度的變數。下例表示說明乙個聯合a bc uni...

C語言中的聯合體union

在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int main union型別是共享記...