考虑一个表示单向链表中的条目的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