→ F04E: 沒 header file ?? 06/22 10:06
→ shinchun: 有header files 但是code base update struct會變 06/22 10:54
※ 編輯: shinchun (210.61.233.66 臺灣), 06/22/2021 10:55:40
推 LPH66: 你只能手動改, C/C++ 沒有其他中繼語言類程式語言中會有的 06/22 11:06
→ LPH66: reflection 類的機制存在 (因為是編譯式語言的關係) 06/22 11:07
推 LPH66: 最接近的方式只有讓你的結構能用 get<> 存取 06/22 11:11
→ LPH66: 但這仍然需要在結構之外額外定義 get<N> 對這結構的特化 06/22 11:11
→ LPH66: 然後以下是我的水晶球: 我猜你大概是想要做些除錯列印 06/22 11:15
→ LPH66: 如果只是這樣的話你可以隨著結構額外維護一個列印函數 06/22 11:16
→ LPH66: 當結構有改時記得去列印函數裡增減 06/22 11:16
這個結構也不能隨便動 目的是一樣的struct會有三份數據
NewDefault,OldDefault,user setting
compare NewDefault.OldDefault知道那些membe default數值有變動
接著把變動的部分sync to user setting
但是sync to user setting之前又得Compare OldDefault/user setting compare
看看user改過那些setting 這些setting又得保留
※ 編輯: shinchun (110.30.121.152 臺灣), 06/22/2021 11:54:37
→ Lipraxde: 我覺得每個設定多附一個 bool 指示是使用 default / us 06/22 13:08
→ Lipraxde: er setting 會比較合理 06/22 13:08
→ Lipraxde: 單純比較的話應該是無法分出跟 default 一樣的值到底是 06/22 13:10
→ Lipraxde: 不是 user 指定的 06/22 13:10
推 LPH66: 所以其實是成員的遍歷, 只是遍歷處理邏輯類似想抽出來 06/22 14:20
→ LPH66: 那這其實就是 visitor pattern, 把遍歷邏輯抽出來之後 06/22 14:20
→ LPH66: 寫一個處理函數手動列舉成員遍歷 06/22 14:21
→ LPH66: C++ 有 template 可以把遍歷邏輯寫的簡潔一點 06/22 14:21
→ LPH66: C 只能用 macro 達成類似的效果 06/22 14:21
→ LPH66: 但不管哪一個, 列舉成員這件事只能手動 06/22 14:22
→ LPH66: 就算要支援 get<> 存取也跑不掉手動指定哪一個抓哪一個 06/22 14:23
ofsetof sizeof都得指定member name
code base也只能用C 沒法用C++
https://github.com/tianocore/edk2
不曉得有什麼macro可以達到掃所有member size?
→ F04E: 太複雜 跟著一起 update header file 不就好了 06/22 16:10
目前就是有類似的作法 但是maintain effort或是出錯機會比較大
推 CoNsTaR: 編譯式還是可以有 reflection 啦 06/22 20:16
→ CoNsTaR: 像是 idris 的 elab reflection 06/22 20:16
推 CoNsTaR: 要做這種事要嘛就是要有很強的類型系統,要嘛就是macro 06/22 20:19
→ CoNsTaR: 或編譯器魔法 06/22 20:19
跪求macro或是編譯器魔法
※ 編輯: shinchun (110.30.121.152 臺灣), 06/22/2021 21:55:28
→ sarafciel: 編譯器魔法我不知道 但macro你不會想用的 相信我 06/22 22:04
→ Lipraxde: 是說你其實不一定要用 struct 存吧?拿個 string map 06/22 22:28
→ Lipraxde: 之類的用不好嗎? 06/22 22:28
因為strut一改影響很大
推 LPH66: 我不是說列舉成員用 macro 喔, 而是說處理函數用 macro 寫 06/23 00:25
→ LPH66: 然後手動把所有成員在 visit 函數裡列舉出來這樣 06/23 00:29
→ LPH66: 真的硬要的話, 是有一種有點微妙的寫法是 06/23 00:44
→ LPH66: 列舉成員也寫成 macro, 然後所有需要成員列表的程式碼改用 06/23 00:48
→ LPH66: 這個列舉 macro 來代入 (包含結構定義) 06/23 00:48
→ LPH66: 那這個寫法其實初看不好理解, 要新增處理也麻煩 06/23 00:53
→ LPH66: (要多訂一個 macro 再在要的地方引用) 06/23 00:54
→ LPH66: (↑事實上這個新 macro 就是我這段推文第一行說的處理函數) 06/23 00:55
→ LPH66: 那就看你的需求值不值得把結構和它的處理寫成這種麻煩樣了 06/23 00:56
感謝各位高手 看來我得試試看UEFI架構內的別的方法試試看
※ 編輯: shinchun (110.30.121.152 臺灣), 06/23/2021 16:07:29
→ F04E: 這不是交給版本管理處理就好... 06/23 18:13
推 james732: 這種需求應該是firmware會需要的...XDD 06/24 10:18
→ james732: 我也有類似的需求,還真不知道怎麼做 06/24 10:18
推 LPH66: 嘛, 上面這招我是從 LLVM 學來的... 06/24 10:48
→ LPH66: 裡面有很多需要手動列舉某類的所有東西的定義和處理 06/24 10:48
→ LPH66: 這時他們會把列舉出來的這些東西獨立寫成一個 .def 檔案 06/24 10:49
→ LPH66: 當需要這份列舉時就定義處理的 macro 再引入該 .def 檔即可 06/24 10:50
→ LPH66: 我上面的寫法只是把那個 .def 檔案再寫成一個 macro 而已 06/24 10:50
→ LPH66: 那這裡原 PO 的要求裡正好列舉的東西是某結構的所有成員 06/24 10:52
→ F04E: 上面不就是把結構的定義獨立到def檔... 追根究底不就是版本 06/24 11:58
推 kokal: 如果不要求用struct, 可以用protobuf format 06/24 15:48
推 chuegou: 第一次看到用X macro來宣告結構成員 學習了 06/24 19:24
→ LPH66: 版本嗎...我覺得這有點搞錯原 PO 在問的東西 06/27 04:29
→ LPH66: 原 PO 想問的是結構成員和列舉其處理的程式碼間的同步問題 06/27 04:30
→ LPH66: (然後以為用 offsetof 可以反過來列舉才會用這標題) 06/27 04:30
→ LPH66: 把它丟版本只是被動地紀錄誰改了什麼, 實際處理的程式碼 06/27 04:31
→ LPH66: 依然得要手動改, 而這手動改的問題才是原 PO 要問的 06/27 04:31