【问题标题】:C# Preprocessor directivesC# 预处理器指令
【发布时间】:2011-05-24 03:02:22
【问题描述】:

在 C++ 中我们可以这样做:

struct {
#if defined (BIGENDIAN)
        uint32_t h;
        uint32_t l;
#else
        uint32_t l;
        uint32_t h;
#endif
    } dw;

现在,在 C# 中并不那么简单。我有一种测试 BigEndian 的方法,但要在编译时定义结构,我们如何在 C# 中获得相同的效果?我在想我可以拥有像“BoardBig”和“BoardLittle”这样的类,并使用工厂根据 IsBigEndian 检查获得我需要的类。对于 _WIN64 检查,我可以有诸如“Position_64”和“Position_32”之类的类。这是一个好方法吗?由于 C# 无法定义 #define IsBigEndian 1 或 what have 之类的语句,因此不知道该怎么做。

【问题讨论】:

    标签: c# c-preprocessor preprocessor-directive


    【解决方案1】:

    更新:正如其他发帖者所指出的(赞成),这不是 C# 中字节序的解决方案。

    C#Conditional compilation directives

      #if BIGENDIAN
          uint32_t h;    
          uint32_t l;
      #else
          uint32_t l;
          uint32_t h;        
      #endif
    

    顺便说一句,如果可以的话,你应该避免这些。使代码更难测试。

    【讨论】:

    【解决方案2】:

    由于您无法将 C# 结构“内存映射”到原始数据,因此为此目的使用预处理器并没有真正的优势。因此,尽管 C# 确实具有可用于其他目的的预处理器功能,但我认为它们在这里对您没有价值。

    相反,只需使用一种首选结构并为特殊情况隐藏低级位旋转。以下是结构的大端和小端处理示例:

    【讨论】:

    • 读起来似乎很有趣。生病看看。非常感谢
    【解决方案3】:

    C# 中有条件编译,但是你不能用它来根据字节序获得不同的代码。对于托管语言,系统的字节序在编译时是未知的。

    编译器生成的 IL 代码可以在大端和小端系统上执行。 JIT 编译器负责将 IL 代码转换为本地机器代码,并将数字文字转换为正确的格式。

    您可以使用BitConverter.IsLittleEndian 在运行时找出字节序。

    【讨论】:

    • 添加到 BitConverter.IsLittleEndian 的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多