看板 C_and_CPP 關於我們 聯絡資訊
// 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
sarafciel: 呃 你貼了一段C99的code 然後問說在C99怎麼寫?XD 12/11 09:05
SocketAM2: 用union可以規格上保證對,但上面這樣我只是找不到對 12/11 09:15
SocketAM2: 應的文件而已,看起來也挑不出錯… 12/11 09:15
DJWS: 我不確定這樣寫對不對 只是憑感覺寫的... 12/11 09:24
DJWS: 另外 當SuperClass內容很多 我想知道如何精簡ClassA和B 12/11 09:26
Lipraxde: macro 把裡面重複的包一包? 12/11 10:22
DJWS: 有更優雅的方法嗎?我剛發現 #pragma anon_unions 感覺不錯 12/11 10:33
sarafciel: 那你為啥不把SuperClass塞進CLassA跟B裡面? 12/11 11:01
DJWS: 多很多字 不好讀 C99不支援anonymous struct/union 12/11 11:10
DJWS: 樓上你看起來還沒進入狀況 你實際寫一遍就會知道問題在哪了 12/11 11:11
DJWS: 然後我也想知道如何精簡 initializer list 12/11 11:15
a58524andy: https://stackoverflow.com/a/524060 這樣符合ㄇ 12/11 13:06
Bencrie: 我相信很多人都幹過 C 模擬 class,沒有搞不清楚這回事XD 12/11 13:10
Bencrie: 不然你去讀 gobject 的 source code 看有沒有比較好讀 12/11 13:12
DJWS: 我目前就是這樣寫的 但是需要 #pragma anon_unions 12/11 13:13
DJWS: 我也相信很多人都幹過C模擬class 但我覺得s還沒進入狀況XD 12/11 13:16
DJWS: 然後我是第一次用C模擬class 我之前都寫C++... 12/11 13:17
Bencrie: 是喔,那我大概也沒進入狀況吧 12/11 13:20
DJWS: 然後 gobject 跟這件事的關聯在哪?我應該看哪一段code? 12/11 13:20
sarafciel: 我是不知道你想拿anonymous struct/union來做什麼啦 12/11 21:34
sarafciel: https://ideone.com/6lm4Vh 我也不知道這樣寫有什麼 12/11 21:36
sarafciel: 大問題 你可以說說看 我是真的不懂就是XD 12/11 21:37
DJWS: 因為要多打.base啊 多很多字 不好讀 12/12 07:07
DJWS: 這也就是C11要引進anonymous struct/union的原因 12/12 07:07
DJWS: 29行名稱不一致 有的要寫.base 有的不用寫 維護困難 12/12 07:09
DJWS: 如果再多做幾層composition 敲鍵盤就敲到崩潰了 XD 12/12 07:09
Lipraxde: 那就再繼續用 macro 包啊 12/12 07:27
DJWS: 樓上可以示範一下怎麼用 marco 包嗎? 12/12 07:46
DJWS: macro 12/12 08:33
sarafciel: https://ideone.com/1fg4hL 用函式也行 再包就好啦 12/12 16:00
DJWS: 你這樣沒有解決問題喔 12/12 18:14
DJWS: 本來要判斷.base 現在變成要判斷Base_Print 12/12 18:15
DJWS: 只存取num 要選Base_Print 只存取a 要選DerivedA_Print 12/12 18:17
sarafciel: 我本來就不認為那個是問題呀XD 12/12 20:26
sarafciel: Programmer本來就該意識自己在存取的是父類還是子類 12/12 20:26
sarafciel: 從這層意義上講 那個base留著才是可讀性高的寫法 12/12 20:26
sarafciel: 畢竟我可以透過看有沒有base去推斷要去父還是子找定義 12/12 20:27
sarafciel: 只是繼承鍊深的情況下重複寫base很煩我同意 12/12 20:27
DJWS: 無法承認自己的無知 這樣不好喔 您多保重 12/12 20:27
sarafciel: 所以用包函數的方式去把某個動作拆成分層的子問題 12/12 20:27
sarafciel: 然後把定錨父子這件事用型態來解決 12/12 20:28
loveme00835: ADT 的概念那麼差還談 OO xD 12/12 20:39
DJWS: 樓上離題了吧 12/12 20:47
loveme00835: 因為你根本搞不清楚你要做什麼, 先把 data oriented 12/12 21:04
loveme00835: 搞成 object oriented, 所以型別命名就錯掉了. objec 12/12 21:04
loveme00835: t oriented 著重在 service/behavior 所以真正多型的 12/12 21:04
loveme00835: 地方是用 function 來實作, 而不是資料. 如果是 data 12/12 21:04
loveme00835: oriented 你的宣告方式就錯了. 順便一提這條超簡單, 12/12 21:04
loveme00835: 我回家再貼 12/12 21:04
loveme00835: 關鍵字 「macro metaprogramming」 12/12 21:05
DJWS: 所以我猜...你應該知道我要做什麼? XD 12/12 21:13
loveme00835: https://wandbox.org/permlink/WSJJr5q4pFdACcJy 12/12 22:54
Bencrie: 哇賽開始嗆人了 XD 12/13 01:44
Bencrie: gobject system 就是 glib 實作的「C 模擬 class」 12/13 01:51
Bencrie: 不過它模擬的是那個 OO 行為,不是語法糖 12/13 01:52
DJWS: 包成macro原來需要補充這麼多東西 有更優雅的方法嗎? 12/13 07:15
DJWS: 對 我就是在問語法糖啊 在C99底下 你得到他了... 12/13 07:16
DJWS: 然後我的文章標題問的是 strcut aligment 我壓根沒想問OO 12/13 07:19
DJWS: struct 12/13 07:20
loveme00835: 但是你的型別就是 OO 的命名風格, 但作的是 DO 12/13 08:50
loveme00835: 更優雅? 你何不把共用的 variable 增加到 1k 個看看? 12/13 08:52
DJWS: 因為這個案子不會到1k個(記憶體不夠用) 目前就20個而已 12/13 08:56
DJWS: 但是derived class目前就有10個 以後還會越來越多 12/13 08:57
DJWS: 我修正一下 目前有10個derived class 而且將陸續增加 12/13 08:58
DJWS: 程式碼長的很驚人 很難維護 所以想問更精簡的寫法 12/13 09:00
loveme00835: 如果是一般作法就會是用很簡單的 nested struct 去實 12/13 09:01
DJWS: 然後OO命名風格...這就當作是我的錯誤吧 我應該怎麼命名呢? 12/13 09:02
loveme00835: 作, 各自去 maintain 自己的 offset, 但是都可以註冊 12/13 09:02
loveme00835: 同樣 prototype 的 accesor function 去操作, 所以根 12/13 09:03
loveme00835: 本不需要重複的程式碼, 好不好維護完全是設計問題, 12/13 09:05
Bencrie: 那你就寫 code generator 吧。維護的時候用你愛的語法 12/13 09:05
loveme00835: 你硬要用 designated initializer 來初始化物件那這 12/13 09:05
loveme00835: 樣勢必要有展開的動作 12/13 09:06
Bencrie: 要編譯的時候轉成你覺得很醜的 C99 實作 12/13 09:06
loveme00835: 所以問題就是, 你不知道你卡的點在哪, 但是別人提的 12/13 09:08
Bencrie: 是說幹嘛不直接用 C++? toolchain 不給用嗎 12/13 09:08
loveme00835: 方案能解只是需要其他 work, 你不知道也不想作, 因為 12/13 09:09
loveme00835: 你想像的 C99 跟別人的很不一樣 12/13 09:10
DJWS: 兩位交互詰問我很難回答 XD 我先回答Bencrie板友吧 12/13 09:14
DJWS: 我的部分是開發演算法 原始程式碼是javascript 以便可視化 12/13 09:15
DJWS: 並且修正演算法 然後再移植到mcu上面 但是雇主提供的開發 12/13 09:16
DJWS: 環境只有C99沒有C++ 12/13 09:17
DJWS: 再來是loveme前板主 num a b 這些都是演算法參數 12/13 09:20
DJWS: 將來會從外部輸入到mcu 但是還沒跟雇主討論這一塊要怎麼做 12/13 09:21
DJWS: 於是我暫先弄個initializer 以便測試演算法是否能正常運作 12/13 09:23
DJWS: 好了言歸正傳 請問DO風格之下 我應該怎麼命名才對呢? 12/13 09:52
descent: #1QlX0DOR 該篇的 cfront 可以解決你的問題嗎? 12/13 13:17
DJWS: 我第一次聽到 cfront 我下次遇到雇主跟他聊一下 12/13 13:46
DJWS: 剛剛谷歌一陣 cfront是上古時代的東西吧 有點不太現實 12/13 13:53
descent: 想說你只是要處理 class 繼承的語法, 所以才提 cfront 12/13 14:23
ofd168: 大家脾氣真好,只有我覺得D回文很嗆嗎 12/15 15:47
reemir: :) 12/15 21:04
DJWS: 如果各位都覺得我口氣不好 那我道歉 對不起各位 12/15 21:31
eye5002003: 我也有上來討論過類似的話題,試圖讓C語言可以別寫的 12/15 22:25
eye5002003: 又臭又長,最後都是宣告放棄,C就是要寫的傷眼又費力 12/15 22:27
eye5002003: 進入C++11的世界之後又更加無法忍受C了 12/15 22:30
KevinR: ... 12/17 10:20
xvid: 客氣客氣 12/18 08:35
xkhsky: 笑死 12/19 22:31