[問題] UNION initial問題

看板C_and_CPP (C/C++)作者 (宅爸爸)時間14年前 (2011/09/08 19:06), 編輯推噓2(2036)
留言38則, 4人參與, 最新討論串1/1
開發平台(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

09/08 19:45, , 1F

09/08 22:51, , 2F
感謝樓上,但如果考慮cross platform,就不好維護。
09/08 22:51, 2F

09/08 22:51, , 3F
不知ANSCI C有無類似這種定義?
09/08 22:51, 3F

09/08 22:56, , 4F
你用的是 C99 的東西,VC不支援,要換平台還是用 gcc 吧
09/08 22:56, 4F

09/08 22:57, , 5F
另外不知你在宣告時同時初始化的目的為何?是為了方便,還
09/08 22:57, 5F

09/08 22:57, , 6F
是不得不如此,有範例嗎
09/08 22:57, 6F

09/08 23:24, , 7F
應該說我用的是VS2005/2008,他沒有支援C99,印象中我的範
09/08 23:24, 7F

09/08 23:24, , 8F
是GCC擴充的。
09/08 23:24, 8F

09/08 23:26, , 9F
另外我這樣做是為了不用再寫冗長的code做初始化,用一個
09/08 23:26, 9F

09/08 23:27, , 10F
看起來像table的東西來表示。
09/08 23:27, 10F

09/08 23:40, , 11F
P大說的還真沒錯,這是C99的一部份
09/08 23:40, 11F

09/09 09:25, , 12F
使用vc2010看看,其實也可以memset.
09/09 09:25, 12F

09/09 10:06, , 13F
Compiler不是我可以控制的,所以我只能從C99的標準下手。
09/09 10:06, 13F

09/09 10:07, , 14F
我意思是說:我寫的code會再不同環境執行。所以盡量不要寫
09/09 10:07, 14F

09/09 10:09, , 15F
得很奇怪,且要好維護,又要注重執行效率。
09/09 10:09, 15F

09/09 11:11, , 16F
那就用memset來初始化.
09/09 11:11, 16F

09/09 13:00, , 17F
請問A大指的memset是否為
09/09 13:00, 17F

09/09 13:00, , 18F
void *memset(void *b, int c, size_t len);
09/09 13:00, 18F

09/09 14:08, , 19F
恩,不過通常是用來給0值.因為它是塞值到每個位元上
09/09 14:08, 19F

09/09 14:12, , 20F
memset(SS,0x00,sizeof(UU));<--我的習慣是都給0 or -1
09/09 14:12, 20F

09/09 15:36, , 21F
想要可攜 memset 請不要用 -1 xD
09/09 15:36, 21F

09/09 15:50, , 22F
我幾乎是用0喔,-1只用過一次.那次是不得已(扭)
09/09 15:50, 22F

09/09 18:51, , 23F
感謝各路專家提供意見,看來是無解了。我也離題吧:)
09/09 18:51, 23F

09/09 18:52, , 24F
祝各位中秋節快樂
09/09 18:52, 24F

09/09 18:53, , 25F
但若要初始值全部為0,將SS設成global variable就可以了,
09/09 18:53, 25F

09/09 18:54, , 26F
因為loader會將global全部清除為0。
09/09 18:54, 26F

09/09 18:55, , 27F
這樣就省了memset的時間,但處理global variable時要小心
09/09 18:55, 27F

09/09 20:39, , 28F
嚴格來說這樣沒有到達理論上可攜,因為union可能只有初始
09/09 20:39, 28F

09/09 20:40, , 29F
化第一個 member 其他剩下垃圾。
09/09 20:40, 29F

09/09 20:46, , 30F
你用的語法就是要漂亮的解決上面的窘境(只初始化第一個)
09/09 20:46, 30F

09/09 20:48, , 31F
現在不能用了我想應該沒有超漂亮的解 xD
09/09 20:48, 31F

09/10 00:05, , 32F
但是,以實際上的例子,將SS設成global variable且沒有賦
09/10 00:05, 32F

09/10 00:06, , 33F
宇初始值,structure中所佔的全部記憶體都會清為0。
09/10 00:06, 33F

09/10 00:14, , 34F
我講的是全域變數。記憶體清空並不是可攜的概念;例如空指
09/10 00:14, 34F

09/10 00:14, , 35F
標非零的機器上指標會變成空指標(但不是零),然後struct
09/10 00:14, 35F

09/10 00:15, , 36F
每一個成員都會「清空」沒錯,但 union 只會清空第一個。
09/10 00:15, 36F

09/10 00:18, , 37F
如果你想尋求 C99 的話,可以看 N1256 6.7.8p10
09/10 00:18, 37F

09/10 00:21, , 38F
(精神上是清空沒錯啦,但不是記憶體清空(歸零)xD)
09/10 00:21, 38F
文章代碼(AID): #1EQA74C4 (C_and_CPP)
文章代碼(AID): #1EQA74C4 (C_and_CPP)