我想命名字段而不是索引字段,但对于某些用途,我必须迭代字段。愚蠢的简化示例:
struct named_states {float speed; float position;};
#define NSTATES (sizeof(struct named_states)/sizeof(float))
union named_or_indexed_states {
struct named_states named;
float indexed[NSTATES];
}
...
union named_or_indexed_states states,derivatives;
states.named.speed = 0;
states.named.position = 0;
...
derivatives.named.speed = acceleration;
derivatives.named.position= states.named.speed;
...
/* This code is in a generic library (consider nstates=NSTATES) */
for(i=0;i<nstates;i++)
states.indexed[i] += time_step*derivatives.indexed[i];
这避免了从命名结构到索引数组的复制,反之亦然,并将其替换为通用解决方案,因此更易于维护(当我增加状态向量时,我几乎没有地方可以更改)。它也适用于各种我测试过的编译器(多个版本的 gcc/g++ 和 MSVC)。
但从理论上讲,据我了解,它并没有严格遵守正确的联合使用,因为我编写了命名字段然后读取了索引字段,而且我完全不确定我们可以说它们共享相同的结构字段......
你能确认它在理论上是坏的(不可移植)吗?
我应该更好地使用演员表、memcpy() 还是其他东西?
除了理论之外,从实用的 POV 来看,是否存在任何真正的可移植性问题(一些不兼容的编译器、奇异的结构对齐、计划的演变......)?
编辑:你的答案应该更清楚地说明我的意图是:
- 让程序员专注于特定领域的方程并将它们从转换函数的维护中释放出来(我不知道如何编写一个通用的,除了看起来不太健壮的强制转换或 memcpy 技巧)
- 通过使用结构(由编译器完全控制)与数组(声明和访问受更多程序员错误影响)来增加更多的编码安全性
- 避免使用 enum 或 #define 过多地污染命名空间
我需要知道
- 我偏离标准有多便携/危险(也许一些具有激进内联的编译器将使用完整的寄存器解决方案并避免任何内存交换破坏技巧),
- 如果我错过了部分或全部解决上述问题的标准解决方案。