看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) N 問題(Question): 問題1: 我建立了下列的類別 union MyUnion { public: unsigned char Array[14]; class { public: unsigned char InfoA[2]; unsigned char InfoB[4]; unsigned char InfoC[8]; }; }; 並於程式中希望藉由下列方式存取 MyUnion Obj; Obj.Array[13] = 0x00; Obj.InfoA[0] = 0x00; Obj.InfoB[1] = 0x00; Obj.InfoC[7] = 0x00; 在 Code::Blocks + GCC 下可以正常編譯並執行,但在codepad.org的線上編譯卻出現 錯誤訊息(紅字部分): error: ISO C++ prohibits anonymous structs compilation terminated due to -Wfatal-errors. 請問如果要避開這種錯誤且不改變上述存取方式,有可能做到嗎? 問題2: 我使用 Code::Blocks + GCC 來印出InfoA、InfoB與InfoC中每個元素的在記憶體中的位 址,發現是連續的,且與Array相同(當然這是一定的,因為用了union),想請問我能確 信InfoA、InfoB與InfoC無論在怎麼樣的狀況下,都是會被安排在連續的記憶體位址嗎? 因為程式中我想以Obj.InfoA的方式存取,然後最後再以 fstream.write(Obj.Array, 14); 的方式寫入外部檔案。 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.72.212.238
icetofux:剛剛試出一個方法,把紅色的class換成struct似乎可行 05/10 12:03
icetofux:可是codepad現在連不上沒辦法測跟貼程式碼Orz 05/10 12:04
purpose:-pedantic-errors 編譯的時候,加上這個參數 05/10 12:28
loveme00835:問題1: 倒數第2個分號前面加上成員名, 存取時較麻煩些 05/10 15:59
icetofux:我有想過加成員名,可是會讓InfoX跟Array的存取方式 05/10 17:12
icetofux:不一致,這有點困擾。 05/10 17:12
icetofux:目前看來用struct可能是比較好的方式了。 05/10 17:13
loveme00835:http://codepad.org/Kwg7Nsin 05/10 18:41
loveme00835:我不會把成員暴露在外面讓別人知道太多細節, 甚至呼叫 05/10 18:45
loveme00835:也不必 sizeof(T) 這種多餘的動作 05/10 18:46
james732:板主的寫法好酷... 真的可以表現C跟C++的差異 XDDD 05/10 18:49
loveme00835:http://goo.gl/C5LXF 換實作也秒殺, 根本不用在意對齊 05/10 18:56
loveme00835:的問題 05/10 18:56