[問題] struct alignment

看板C_and_CPP (C/C++)作者 (...)時間5年前 (2019/12/11 07:58), 5年前編輯推噓7(11484)
留言99則, 14人參與, 5年前最新討論串1/4 (看更多)
// C99 struct SuperClass { int num; }; struct ClassA { int num; int a; }; struct ClassB { int num; int b; }; struct ClassA objA = { .num = 0, .a = 0 }; struct ClassB objB = { .num = 0, .b = 0 }; void func(void* obj) { struct SuperClass* object = obj; object->num++; } int main(void) { func(&objA); func(&objB); return 0; } 我想做類似的事情,請問在C99要怎麼寫? 不能使用malloc -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.45.77.126 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1576022328.A.11B.html ※ 編輯: DJWS (114.45.77.126 臺灣), 12/11/2019 08:07:14

12/11 09:05, 5年前 , 1F
呃 你貼了一段C99的code 然後問說在C99怎麼寫?XD
12/11 09:05, 1F

12/11 09:15, 5年前 , 2F
用union可以規格上保證對,但上面這樣我只是找不到對
12/11 09:15, 2F

12/11 09:15, 5年前 , 3F
應的文件而已,看起來也挑不出錯…
12/11 09:15, 3F

12/11 09:24, 5年前 , 4F
我不確定這樣寫對不對 只是憑感覺寫的...
12/11 09:24, 4F

12/11 09:26, 5年前 , 5F
另外 當SuperClass內容很多 我想知道如何精簡ClassA和B
12/11 09:26, 5F

12/11 10:22, 5年前 , 6F
macro 把裡面重複的包一包?
12/11 10:22, 6F

12/11 10:33, 5年前 , 7F
有更優雅的方法嗎?我剛發現 #pragma anon_unions 感覺不錯
12/11 10:33, 7F

12/11 11:01, 5年前 , 8F
那你為啥不把SuperClass塞進CLassA跟B裡面?
12/11 11:01, 8F

12/11 11:10, 5年前 , 9F
多很多字 不好讀 C99不支援anonymous struct/union
12/11 11:10, 9F

12/11 11:11, 5年前 , 10F
樓上你看起來還沒進入狀況 你實際寫一遍就會知道問題在哪了
12/11 11:11, 10F

12/11 11:15, 5年前 , 11F
然後我也想知道如何精簡 initializer list
12/11 11:15, 11F

12/11 13:06, 5年前 , 12F
12/11 13:06, 12F

12/11 13:10, 5年前 , 13F
我相信很多人都幹過 C 模擬 class,沒有搞不清楚這回事XD
12/11 13:10, 13F

12/11 13:12, 5年前 , 14F
不然你去讀 gobject 的 source code 看有沒有比較好讀
12/11 13:12, 14F

12/11 13:13, 5年前 , 15F
我目前就是這樣寫的 但是需要 #pragma anon_unions
12/11 13:13, 15F

12/11 13:16, 5年前 , 16F
我也相信很多人都幹過C模擬class 但我覺得s還沒進入狀況XD
12/11 13:16, 16F

12/11 13:17, 5年前 , 17F
然後我是第一次用C模擬class 我之前都寫C++...
12/11 13:17, 17F

12/11 13:20, 5年前 , 18F
是喔,那我大概也沒進入狀況吧
12/11 13:20, 18F

12/11 13:20, 5年前 , 19F
然後 gobject 跟這件事的關聯在哪?我應該看哪一段code?
12/11 13:20, 19F

12/11 21:34, 5年前 , 20F
我是不知道你想拿anonymous struct/union來做什麼啦
12/11 21:34, 20F

12/11 21:36, 5年前 , 21F
https://ideone.com/6lm4Vh 我也不知道這樣寫有什麼
12/11 21:36, 21F

12/11 21:37, 5年前 , 22F
大問題 你可以說說看 我是真的不懂就是XD
12/11 21:37, 22F

12/12 07:07, 5年前 , 23F
因為要多打.base啊 多很多字 不好讀
12/12 07:07, 23F

12/12 07:07, 5年前 , 24F
這也就是C11要引進anonymous struct/union的原因
12/12 07:07, 24F

12/12 07:09, 5年前 , 25F
29行名稱不一致 有的要寫.base 有的不用寫 維護困難
12/12 07:09, 25F

12/12 07:09, 5年前 , 26F
如果再多做幾層composition 敲鍵盤就敲到崩潰了 XD
12/12 07:09, 26F

12/12 07:27, 5年前 , 27F
那就再繼續用 macro 包啊
12/12 07:27, 27F

12/12 07:46, 5年前 , 28F
樓上可以示範一下怎麼用 marco 包嗎?
12/12 07:46, 28F

12/12 08:33, 5年前 , 29F
macro
12/12 08:33, 29F

12/12 16:00, 5年前 , 30F
https://ideone.com/1fg4hL 用函式也行 再包就好啦
12/12 16:00, 30F

12/12 18:14, 5年前 , 31F
你這樣沒有解決問題喔
12/12 18:14, 31F

12/12 18:15, 5年前 , 32F
本來要判斷.base 現在變成要判斷Base_Print
12/12 18:15, 32F

12/12 18:17, 5年前 , 33F
只存取num 要選Base_Print 只存取a 要選DerivedA_Print
12/12 18:17, 33F

12/12 20:26, 5年前 , 34F
我本來就不認為那個是問題呀XD
12/12 20:26, 34F

12/12 20:26, 5年前 , 35F
Programmer本來就該意識自己在存取的是父類還是子類
12/12 20:26, 35F

12/12 20:26, 5年前 , 36F
從這層意義上講 那個base留著才是可讀性高的寫法
12/12 20:26, 36F

12/12 20:27, 5年前 , 37F
畢竟我可以透過看有沒有base去推斷要去父還是子找定義
12/12 20:27, 37F

12/12 20:27, 5年前 , 38F
只是繼承鍊深的情況下重複寫base很煩我同意
12/12 20:27, 38F

12/12 20:27, 5年前 , 39F
無法承認自己的無知 這樣不好喔 您多保重
12/12 20:27, 39F

12/12 20:27, 5年前 , 40F
所以用包函數的方式去把某個動作拆成分層的子問題
12/12 20:27, 40F

12/12 20:28, 5年前 , 41F
然後把定錨父子這件事用型態來解決
12/12 20:28, 41F

12/12 20:39, 5年前 , 42F
ADT 的概念那麼差還談 OO xD
12/12 20:39, 42F

12/12 20:47, 5年前 , 43F
樓上離題了吧
12/12 20:47, 43F

12/12 21:04, 5年前 , 44F
因為你根本搞不清楚你要做什麼, 先把 data oriented
12/12 21:04, 44F

12/12 21:04, 5年前 , 45F
搞成 object oriented, 所以型別命名就錯掉了. objec
12/12 21:04, 45F

12/12 21:04, 5年前 , 46F
t oriented 著重在 service/behavior 所以真正多型的
12/12 21:04, 46F

12/12 21:04, 5年前 , 47F
地方是用 function 來實作, 而不是資料. 如果是 data
12/12 21:04, 47F

12/12 21:04, 5年前 , 48F
oriented 你的宣告方式就錯了. 順便一提這條超簡單,
12/12 21:04, 48F

12/12 21:04, 5年前 , 49F
我回家再貼
12/12 21:04, 49F

12/12 21:05, 5年前 , 50F
關鍵字 「macro metaprogramming」
12/12 21:05, 50F

12/12 21:13, 5年前 , 51F
所以我猜...你應該知道我要做什麼? XD
12/12 21:13, 51F

12/12 22:54, 5年前 , 52F

12/13 01:44, 5年前 , 53F
哇賽開始嗆人了 XD
12/13 01:44, 53F

12/13 01:51, 5年前 , 54F
gobject system 就是 glib 實作的「C 模擬 class」
12/13 01:51, 54F

12/13 01:52, 5年前 , 55F
不過它模擬的是那個 OO 行為,不是語法糖
12/13 01:52, 55F

12/13 07:15, 5年前 , 56F
包成macro原來需要補充這麼多東西 有更優雅的方法嗎?
12/13 07:15, 56F

12/13 07:16, 5年前 , 57F
對 我就是在問語法糖啊 在C99底下 你得到他了...
12/13 07:16, 57F

12/13 07:19, 5年前 , 58F
然後我的文章標題問的是 strcut aligment 我壓根沒想問OO
12/13 07:19, 58F

12/13 07:20, 5年前 , 59F
struct
12/13 07:20, 59F

12/13 08:50, 5年前 , 60F
但是你的型別就是 OO 的命名風格, 但作的是 DO
12/13 08:50, 60F

12/13 08:52, 5年前 , 61F
更優雅? 你何不把共用的 variable 增加到 1k 個看看?
12/13 08:52, 61F

12/13 08:56, 5年前 , 62F
因為這個案子不會到1k個(記憶體不夠用) 目前就20個而已
12/13 08:56, 62F

12/13 08:57, 5年前 , 63F
但是derived class目前就有10個 以後還會越來越多
12/13 08:57, 63F

12/13 08:58, 5年前 , 64F
我修正一下 目前有10個derived class 而且將陸續增加
12/13 08:58, 64F

12/13 09:00, 5年前 , 65F
程式碼長的很驚人 很難維護 所以想問更精簡的寫法
12/13 09:00, 65F

12/13 09:01, 5年前 , 66F
如果是一般作法就會是用很簡單的 nested struct 去實
12/13 09:01, 66F

12/13 09:02, 5年前 , 67F
然後OO命名風格...這就當作是我的錯誤吧 我應該怎麼命名呢?
12/13 09:02, 67F

12/13 09:02, 5年前 , 68F
作, 各自去 maintain 自己的 offset, 但是都可以註冊
12/13 09:02, 68F

12/13 09:03, 5年前 , 69F
同樣 prototype 的 accesor function 去操作, 所以根
12/13 09:03, 69F

12/13 09:05, 5年前 , 70F
本不需要重複的程式碼, 好不好維護完全是設計問題,
12/13 09:05, 70F

12/13 09:05, 5年前 , 71F
那你就寫 code generator 吧。維護的時候用你愛的語法
12/13 09:05, 71F

12/13 09:05, 5年前 , 72F
你硬要用 designated initializer 來初始化物件那這
12/13 09:05, 72F

12/13 09:06, 5年前 , 73F
樣勢必要有展開的動作
12/13 09:06, 73F

12/13 09:06, 5年前 , 74F
要編譯的時候轉成你覺得很醜的 C99 實作
12/13 09:06, 74F

12/13 09:08, 5年前 , 75F
所以問題就是, 你不知道你卡的點在哪, 但是別人提的
12/13 09:08, 75F

12/13 09:08, 5年前 , 76F
是說幹嘛不直接用 C++? toolchain 不給用嗎
12/13 09:08, 76F

12/13 09:09, 5年前 , 77F
方案能解只是需要其他 work, 你不知道也不想作, 因為
12/13 09:09, 77F

12/13 09:10, 5年前 , 78F
你想像的 C99 跟別人的很不一樣
12/13 09:10, 78F

12/13 09:14, 5年前 , 79F
兩位交互詰問我很難回答 XD 我先回答Bencrie板友吧
12/13 09:14, 79F

12/13 09:15, 5年前 , 80F
我的部分是開發演算法 原始程式碼是javascript 以便可視化
12/13 09:15, 80F

12/13 09:16, 5年前 , 81F
並且修正演算法 然後再移植到mcu上面 但是雇主提供的開發
12/13 09:16, 81F

12/13 09:17, 5年前 , 82F
環境只有C99沒有C++
12/13 09:17, 82F

12/13 09:20, 5年前 , 83F
再來是loveme前板主 num a b 這些都是演算法參數
12/13 09:20, 83F

12/13 09:21, 5年前 , 84F
將來會從外部輸入到mcu 但是還沒跟雇主討論這一塊要怎麼做
12/13 09:21, 84F

12/13 09:23, 5年前 , 85F
於是我暫先弄個initializer 以便測試演算法是否能正常運作
12/13 09:23, 85F

12/13 09:52, 5年前 , 86F
好了言歸正傳 請問DO風格之下 我應該怎麼命名才對呢?
12/13 09:52, 86F

12/13 13:17, 5年前 , 87F
#1QlX0DOR 該篇的 cfront 可以解決你的問題嗎?
12/13 13:17, 87F

12/13 13:46, 5年前 , 88F
我第一次聽到 cfront 我下次遇到雇主跟他聊一下
12/13 13:46, 88F

12/13 13:53, 5年前 , 89F
剛剛谷歌一陣 cfront是上古時代的東西吧 有點不太現實
12/13 13:53, 89F

12/13 14:23, 5年前 , 90F
想說你只是要處理 class 繼承的語法, 所以才提 cfront
12/13 14:23, 90F

12/15 15:47, 5年前 , 91F
大家脾氣真好,只有我覺得D回文很嗆嗎
12/15 15:47, 91F

12/15 21:04, 5年前 , 92F
:)
12/15 21:04, 92F

12/15 21:31, 5年前 , 93F
如果各位都覺得我口氣不好 那我道歉 對不起各位
12/15 21:31, 93F

12/15 22:25, 5年前 , 94F
我也有上來討論過類似的話題,試圖讓C語言可以別寫的
12/15 22:25, 94F

12/15 22:27, 5年前 , 95F
又臭又長,最後都是宣告放棄,C就是要寫的傷眼又費力
12/15 22:27, 95F

12/15 22:30, 5年前 , 96F
進入C++11的世界之後又更加無法忍受C了
12/15 22:30, 96F

12/17 10:20, 5年前 , 97F
...
12/17 10:20, 97F

12/18 08:35, 5年前 , 98F
客氣客氣
12/18 08:35, 98F

12/19 22:31, 5年前 , 99F
笑死
12/19 22:31, 99F
文章代碼(AID): #1Ty34u4R (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Ty34u4R (C_and_CPP)