工會患有一個問題,即沒有簡單的方法可以知道工會的哪個成員最後一次發生了變化。爲了跟蹤此信息,您可以將union
嵌入具有另一個成員(稱爲「標記字段」或「判別式」)的結構中。標記字段的用途是提醒哪個成員被更改/更新。你可以試試這個:
typedef struct{
int payType; // Tag field
union{
int basicPay;
int lumsumPay;
int mothlyPay;
int weeklyPay;
int dailyPay;
int anualPay;
}OptimizeOptions;
}Options;
但是,有沒有必要寫工會六個獨立成員的情況下,都是int
類型。因此,它可以減少到
typedef struct{
enum{BASIC_PAY, LUMSUM_PAY, MONTHLU_PAY, WEEKLY_PAY, DAILY_PAY, ANNUAL_PAY} payType;
int pay;
}Options;
允許瞭解使用標記字段的一個簡單的例子。假設我們需要一個可以存儲int
和double
類型數據的數組。這可以通過使用union
來實現。因此,首先定義一個聯合類型,它將存儲int
或double
。
typedef union {
int i;
double d;
} Num;
接下來我們要創建一個數組,其元素爲Num
型
Num num_arr[100];
現在,假設我們要分配的num_arr
的元素0
存儲25
,而元素1
店3.147
。這可以作爲
num_arr[0].i = 25;
num_arr[1].d = 3.147;
現在假設我們在寫這將打印num_arr
元素的函數來完成。功能如下:
void print_num(Num n)
{
if(n contains integer)
printf("%d", n.i);
else
printf("%f", n.d);
}
等等! print_num
如何決定n
是否包含整數或double
?
這將通過使用標記字段來完成:
typedef struct{
enum{INT, DOUBLE} kind; //Tag field
union{
int i;
double d;
}u;
}Num;
因此,每個值被分配給的u
成員時間,kind
絕被設置爲INT
或DOUBLE
提醒我們實際存儲了什麼類型。例如:
n.u.i = 100;
n.kind = INT;
的print_num
功能會是這樣的:
void print_num(Num n)
{
if(n.kind == INT)
printf("%d", n.i);
else
printf("%f", n.d);
}
:這是程序員的責任,每個分配的union
成員更新標記字段。忘記這麼做會導致錯誤,正如comment by @ j_random_hacker所指出的那樣。
@ user3121023是對的 - 只有當一個或多個成員具有不同類型時,才需要聯合。還有拼寫:'lumpsumPay','monthlyPay'和'annualPay'。 – 2014-10-10 17:37:12