繁体   English   中英

C# 预处理器指令

[英]C# Preprocessor directives

在 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 检查的 class。 对于 _WIN64 检查,我可以有诸如“Position_64”和“Position_32”之类的类。 这是一个好方法吗? 由于 C# 无法定义 #define IsBigEndian 1 之类的语句或什么有你,不知道该怎么做。

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

C#条件编译指令

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM