C# 预处理器指令

Posted

技术标签:

【中文标题】C# 预处理器指令【英文标题】:C# Preprocessor directives 【发布时间】: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 之类的语句,因此不知道该怎么做。

【问题讨论】:

【参考方案1】:

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

C#Conditional compilation directives

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

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

【讨论】:

您已链接到 JScript 的文档。这是 C# 版本:msdn.microsoft.com/en-us/library/aa691095.aspx【参考方案2】:

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

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

Marshalling a big-endian byte collection into a struct in order to pull out values

【讨论】:

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

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

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

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

【讨论】:

添加到 BitConverter.IsLittleEndian 的链接

以上是关于C# 预处理器指令的主要内容,如果未能解决你的问题,请参考以下文章

C#预处理器指令——学习

您可以为 C# 版本添加预处理器指令吗?

C# 预处理器指令

《C#零基础入门之百识百例》(九十一)预处理器指令 -- 代码示例

《C#零基础入门之百识百例》(九十一)预处理器指令 -- 代码示例

在 C# 的 #if 中使用 #define 预处理器指令是不是有效