基于平台或字节序的条件编译器指令?

时间:2013-03-23 14:01:06

标签: c# visual-studio-2010 c-preprocessor endianness

我有一些代码,有一天会发现自己被埋在一个大型的C#应用​​程序中,很久以前就被遗忘和忽视了,而且我可能已经过去了或者老了。这段代码有一个严重的问题。它取决于平台的字节顺序,由于代码的性质,我不能简单地将其括在if(BitConverter.IsLittleEndian)中。 (它涉及一些接收外部值的LayoutKind.Explicit结构和重叠字段 - 重叠字段需要正确定位以获得小/大字节顺序,否则程序会在读取错误值时慢慢损坏自己) < / p>

我想要的是源代码中的编译器指令,要么根据目标平台提供两种结构布局('任何CPU'都有点问题),要么更可能只检测代码是否正在编译除x86或x64以外的平台并发出编译器#error,以便维护代码的任何人都可以定向到该源文件并看到我的注释,指出平台依赖性以及big-endian所需的任何更改。

我可以在构建配置中粘贴一个符号,但是没有一种好的方法来记录它的原因,或者确保未来的程序员不会丢弃它,或者盲目地将它复制到新的构建配置中。 ARM或其他大端平台。

1 个答案:

答案 0 :(得分:0)

这样的事情可能有用吗?:

interface MyStruct { ... }
struct BigEndianStruct : MyStruct { ... }
struct LittleEndianStruct : MyStruct { ... }

在任何地方使用MyStruct而不是endian特定结构。要创建这些结构,您可以使用以下内容:

public static MyStruct CreateStruct() { 
  return BitConverter.IsLittleEndian
          ? new LittleEndianStruct()
          : new BigEndianStruct();
}