作者lungswu (宅爸爸)
看板C_and_CPP
標題[問題] UNION initial問題
時間Thu Sep 8 19:06:32 2011
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ (使用C語法)
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) NONE
問題(Question): 於GCC中,要於宣告union時同時做initial的作法為
1 typedef union {
2 char c0;
3 short s0;
4 char c[10];
5 } UU;
6
7 typedef struct {
8 char a;
9 UU b;
10 } SS;
11
12 int main (void)
13 {
14
15 SS b = {'a', {.s0 = 2}};
16
17 return 0;
18 }
19
那請問各位高手,於VC中要如何做?
餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): 這邊只能用C語法,不用C++語法
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 134.122.249.1
→ lungswu:感謝樓上,但如果考慮cross platform,就不好維護。 09/08 22:51
→ lungswu:不知ANSCI C有無類似這種定義? 09/08 22:51
推 purpose:你用的是 C99 的東西,VC不支援,要換平台還是用 gcc 吧 09/08 22:56
→ purpose:另外不知你在宣告時同時初始化的目的為何?是為了方便,還 09/08 22:57
→ purpose:是不得不如此,有範例嗎 09/08 22:57
→ lungswu:應該說我用的是VS2005/2008,他沒有支援C99,印象中我的範 09/08 23:24
→ lungswu:是GCC擴充的。 09/08 23:24
→ lungswu:另外我這樣做是為了不用再寫冗長的code做初始化,用一個 09/08 23:26
→ lungswu:看起來像table的東西來表示。 09/08 23:27
→ lungswu:P大說的還真沒錯,這是C99的一部份 09/08 23:40
→ angleevil:使用vc2010看看,其實也可以memset. 09/09 09:25
→ lungswu:Compiler不是我可以控制的,所以我只能從C99的標準下手。 09/09 10:06
→ lungswu:我意思是說:我寫的code會再不同環境執行。所以盡量不要寫 09/09 10:07
→ lungswu:得很奇怪,且要好維護,又要注重執行效率。 09/09 10:09
→ angleevil:那就用memset來初始化. 09/09 11:11
→ lungswu:請問A大指的memset是否為 09/09 13:00
→ lungswu:void *memset(void *b, int c, size_t len); 09/09 13:00
→ angleevil:恩,不過通常是用來給0值.因為它是塞值到每個位元上 09/09 14:08
→ angleevil:memset(SS,0x00,sizeof(UU));<--我的習慣是都給0 or -1 09/09 14:12
→ Favonia:想要可攜 memset 請不要用 -1 xD 09/09 15:36
→ angleevil:我幾乎是用0喔,-1只用過一次.那次是不得已(扭) 09/09 15:50
→ lungswu:感謝各路專家提供意見,看來是無解了。我也離題吧:) 09/09 18:51
→ lungswu:祝各位中秋節快樂 09/09 18:52
→ lungswu:但若要初始值全部為0,將SS設成global variable就可以了, 09/09 18:53
→ lungswu:因為loader會將global全部清除為0。 09/09 18:54
→ lungswu:這樣就省了memset的時間,但處理global variable時要小心 09/09 18:55
→ Favonia:嚴格來說這樣沒有到達理論上可攜,因為union可能只有初始 09/09 20:39
→ Favonia:化第一個 member 其他剩下垃圾。 09/09 20:40
→ Favonia:你用的語法就是要漂亮的解決上面的窘境(只初始化第一個) 09/09 20:46
→ Favonia:現在不能用了我想應該沒有超漂亮的解 xD 09/09 20:48
→ lungswu:但是,以實際上的例子,將SS設成global variable且沒有賦 09/10 00:05
→ lungswu:宇初始值,structure中所佔的全部記憶體都會清為0。 09/10 00:06
→ Favonia:我講的是全域變數。記憶體清空並不是可攜的概念;例如空指 09/10 00:14
→ Favonia:標非零的機器上指標會變成空指標(但不是零),然後struct 09/10 00:14
→ Favonia:每一個成員都會「清空」沒錯,但 union 只會清空第一個。 09/10 00:15
→ Favonia:如果你想尋求 C99 的話,可以看 N1256 6.7.8p10 09/10 00:18
→ Favonia:(精神上是清空沒錯啦,但不是記憶體清空(歸零)xD) 09/10 00:21