我有一些代码,有一天会发现自己被埋在一个大型的C#应用程序中,很久以前就被遗忘和忽视了,而且我可能已经过去了或者老了。这段代码有一个严重的问题。它取决于平台的字节顺序,由于代码的性质,我不能简单地将其括在if(BitConverter.IsLittleEndian)
中。 (它涉及一些接收外部值的LayoutKind.Explicit结构和重叠字段 - 重叠字段需要正确定位以获得小/大字节顺序,否则程序会在读取错误值时慢慢损坏自己) < / p>
我想要的是源代码中的编译器指令,要么根据目标平台提供两种结构布局('任何CPU'都有点问题),要么更可能只检测代码是否正在编译除x86或x64以外的平台并发出编译器#error
,以便维护代码的任何人都可以定向到该源文件并看到我的注释,指出平台依赖性以及big-endian所需的任何更改。
我可以在构建配置中粘贴一个符号,但是没有一种好的方法来记录它的原因,或者确保未来的程序员不会丢弃它,或者盲目地将它复制到新的构建配置中。 ARM或其他大端平台。
答案 0 :(得分:0)
这样的事情可能有用吗?:
interface MyStruct { ... }
struct BigEndianStruct : MyStruct { ... }
struct LittleEndianStruct : MyStruct { ... }
在任何地方使用MyStruct而不是endian特定结构。要创建这些结构,您可以使用以下内容:
public static MyStruct CreateStruct() {
return BitConverter.IsLittleEndian
? new LittleEndianStruct()
: new BigEndianStruct();
}