【问题标题】:Conditional compiler directive based on platform or endianness?基于平台或字节序的条件编译器指令?
【发布时间】:2013-03-23 14:01:05
【问题描述】:

我有一些代码有一天会发现自己被埋在一个大型 C# 应用程序中,长期以来被遗忘和忽视,而我可能早已不在或年迈。不过,这段代码有一个严重的问题。它取决于平台的字节顺序,并且由于代码的性质,我不能简单地将其包含在if(BitConverter.IsLittleEndian) 中。 (它涉及一些 LayoutKind.Explicit 结构和接收外部值的重叠字段 - 重叠字段需要正确定位以实现小/大字节序,否则程序将在读取错误值时慢慢损坏自身)

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

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

【问题讨论】:

  • 有没有办法重构使用BitConverter.IsLittleEndian?那将是最干净,可能是最正确的做事方式。
  • 我感受到你的痛苦,但 AFAIK 没有任何东西可以直接支持这一点
  • 我曾想过添加一个静态类/构造函数,它只检查字节顺序,然后在应用程序运行后立即抛出一个丑陋的“此代码无法按编译后工作”异常。跨度>
  • 像静态类中的硬编码单元测试?至少应该是一个很好的警告。我打算建议,如果你不能清理你的结构,然后走另一条路……定义每个字节。即制定一个有效映射每个字节、位范围的规范。丑陋,但没有字节序......缺点你需要一个包装类来访问。
  • 出于兴趣,你为什么不能将这些结构解压缩成更干净的东西。表现?内存?

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


【解决方案1】:

也许这样的东西会起作用?:

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

在任何地方都使用 MyStruct 而不是特定于字节序的结构。要创建这些结构,您将拥有如下内容:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2011-03-06
    • 2010-11-21
    相关资源
    最近更新 更多