2011-06-15 60 views
3

需要在編譯期間初始化聯合成員。 閱讀一些文章似乎沒有辦法,除了只定義在工會的第一個 條目。除非您使用C99,否則您可以專門定義每個聯合成員。初始化聯盟成員 - 使用MS visual studio

事情是我使用Visual Studio 2010教授似乎它不支持C99或我如何啓用ist? 或者還有其他方式來初始化聯合成員?

感謝

typedef union { 
int a; 
char *atxt; 
} MY_UNION_t; 
typedef struct { 
int foo; 
MY_UNION_t un; 
}GEN_DATA_t; 

/* need to do following: */ 
GEN_DATA_t obj1 = {0,1}; /* Okay works */ 
GEN_DATA_t obj2 = {0,"bla"}; /* Does not work */ 

/* ISO C99 allows: */ 
GEN_DATA_t obj3 = {0,.atext="bla"}; /* However MS VS seem not to support this */ 
+1

您試圖常量字符串字面到非恆定字符指針轉換,不是嗎?我認爲這不是一個好主意。 – 2011-06-15 13:30:39

回答

4

當初始化工會,工會的第一個命名成員是將被初始化的一個(ISO 9899:1999 6.7.8§17)。

也就是說,除非你使用C99指定的初始值設定項,就像你試圖在最後一行那樣,那麼選擇的成員就是將被初始化的成員。但是C99顯然不支持VS.

通過改變工會的聲明來解決這個問題:

typedef union { 
char *atxt; 
int a; 
} MY_UNION_t; 

/* make sure that the string "bla" isn't allocated in read-only memory, 
    since you intend to point at it with a non-const pointer */ 
char bla[] = "bla"; 

GEN_DATA_t obj2 = {0, bla};