2012-02-28 67 views
4

如果有幾種可能的選擇,是否可以確定聯合包含哪種類型?如何確定在工會中使用哪種類型?

typedef union 
{ 
    char  charArr[SIZE]; 
    int  intVal; 
    float floatVal; 
} VALUE_TYPE; 

VALUE_TYPE number; 
number.intVal = 8; 

如何知道聯合包含的內容如果值是從其他地方設置的?

回答

5

這是正確的,你不能做這種開箱即用的東西。

解決此問題的常用方法是您可以添加一個類型以及您的聯合。例如,它可能是:

enum { charArr_type, float_type, int_type } VALUE_TYPE; 
typedef union 
{ 
    char  charArr[SIZE]; 
    int  intVal; 
    float floatVal; 
} VALUE; 
struct my_value { 
    VALUE val, 
    VALUE_TYPE val_type 
} 

之後,你只當你將你的結構更新類型:

my_value number; 
number.val.intVal = 8; 
number.val.val_type = is_int 

這是一個常見的現代模式時,你需要有一個共同的類型能夠存儲幾乎任何東西。

例如,你可以在PHP源代碼中的任何地方找到它。這是他們如何在同一個對象中存儲不同的值類型。有關更多詳細信息,請參閱this page

+0

是的,但如果他試圖節省內存,這將需要爲每個「VALUE」存儲額外的'enum'(integer?)。另外,你不能強制用戶存儲一致的值,也就是說可以很容易地寫'my_value.val = 10; my_value.val_type = is_charArr;'! – vulkanino 2012-02-28 09:43:15

+0

@vulkanino你可以做一個包裝來正確設置和獲取這個結構。在PHP中,他們使用大量宏來保護它們的store-everything結構體,並將它們存儲在uchar中。 – Coren 2012-02-28 09:44:34

1

不,你不能說,語言沒有這方面的功能。

如果您需要這些信息,您必須自己跟蹤。

0

使用聯合,您需要跟蹤您輸入的任何類型,並確保您在正確的時間檢索正確的類型。

請勿使用工會。你真的有這樣的內存問題,需要你節省空間?

相關問題