考慮一個表示單向鏈表中的條目的C結構。它包含一個指向一些任意的數據,該數據的大小和方式找到下一個入口在編譯時掛鉤鏈表
其次,考慮條目下面收集和數據,他們表示:
unsigned char dataA[3];
unsigned char dataB[16];
unsigned char dataC[17];
Entry entryA = {dataA, sizeof(dataA), 3}; //It's important for "3" to match up with the index of entryB once it's put into MasterList below.
Entry entryB = {dataB, sizeof(dataB), 4}; //Likewise
Entry entryC = {dataC, sizeof(dataC), 0}; //0 terminates the linked list
Entry emptyEntry = {(void*)0, 0, 0};
Entry MasterList[8] = {
entryA, //Index 0 - Contains dataA and points to Index 3 as the next Entry in a linked list
emptyEntry, //Index 1 - Unused (or used for something else)
emptyEntry, //Index 2 - Unused
entryB, //Index 3 - Contains dataB and points to Index 5 as the next Entry in a linked list
entryC, //Index 4 - Contains dataC and terminates the linked list
emptyEntry, //Index 5 - Unused
emptyEntry, //Index 6 - Unused
emptyEntry};//Index 7 - Unused
我的問題: 你能想出一種方法在編譯時自動計算出「nextEntry」的值嗎?現在,如果有人在MasterList中刷新條目的順序或添加一些其他數據並抵消一些條目,則存在巨大的錯誤潛力。我們通過單元測試或集成測試來捕獲所有的錯誤,但無法避免MasterList的任何更改最終都會被重複檢入兩次。一旦有人編輯它,並且第二次在代碼測試失敗時修補鏈接列表指示。
我最初的本能是「不,這是愚蠢的」,「你爲什麼要嘗試這個?」但過去我已經看到了一些非常令人印象深刻的C-Macro魔術。我也相信任何宏觀魔法都會比上面更糟,但我認爲這值得一試,對吧?
澄清 - 我堅持與MasterList數組(而不是一個適當的鏈表),因爲信息的消費者期待它是這樣的。實際上,那裏還有其他信息不是鏈接列表的一部分,需要位於固定索引處。然後,最重要的是,有這個鏈表的數據。這是一個鏈接列表的原因是使它有點免疫,因爲添加了具有固定索引的其他元素。例如,如果事實證明我們需要在索引3處插入特定的字符串,則entryB和entryC可能會被推開,但仍可通過從鏈表頭開始(固定在索引0處)和走在名單上。
哇。這真的很糟糕。令人印象深刻,我認爲我可以使用它,但是我只是想一點就嘔吐在嘴裏。 – 2015-07-12 17:34:22