如果有幾種可能的選擇,是否可以確定聯合包含哪種類型?如何確定在工會中使用哪種類型?
typedef union
{
char charArr[SIZE];
int intVal;
float floatVal;
} VALUE_TYPE;
VALUE_TYPE number;
number.intVal = 8;
如何知道聯合包含的內容如果值是從其他地方設置的?
如果有幾種可能的選擇,是否可以確定聯合包含哪種類型?如何確定在工會中使用哪種類型?
typedef union
{
char charArr[SIZE];
int intVal;
float floatVal;
} VALUE_TYPE;
VALUE_TYPE number;
number.intVal = 8;
如何知道聯合包含的內容如果值是從其他地方設置的?
這是正確的,你不能做這種開箱即用的東西。
解決此問題的常用方法是您可以添加一個類型以及您的聯合。例如,它可能是:
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。
不,你不能說,語言沒有這方面的功能。
如果您需要這些信息,您必須自己跟蹤。
使用聯合,您需要跟蹤您輸入的任何類型,並確保您在正確的時間檢索正確的類型。
請勿使用工會。你真的有這樣的內存問題,需要你節省空間?
是的,但如果他試圖節省內存,這將需要爲每個「VALUE」存儲額外的'enum'(integer?)。另外,你不能強制用戶存儲一致的值,也就是說可以很容易地寫'my_value.val = 10; my_value.val_type = is_charArr;'! – vulkanino 2012-02-28 09:43:15
@vulkanino你可以做一個包裝來正確設置和獲取這個結構。在PHP中,他們使用大量宏來保護它們的store-everything結構體,並將它們存儲在uchar中。 – Coren 2012-02-28 09:44:34