作者icetofux ()
看板C_and_CPP
標題[問題] 類別中的類別 與 物件的記憶體安排
時間Tue May 10 11:37:07 2011
開發平台(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:我不會把成員暴露在外面讓別人知道太多細節, 甚至呼叫 05/10 18:45
→ loveme00835:也不必 sizeof(T) 這種多餘的動作 05/10 18:46
推 james732:板主的寫法好酷... 真的可以表現C跟C++的差異 XDDD 05/10 18:49
→ loveme00835:的問題 05/10 18:56