【问题标题】:C to C# conversion of #define macros#define 宏的 C 到 C# 转换
【发布时间】:2009-11-01 01:21:48
【问题描述】:

您将如何将以下 C#define 转换为 c#。

        #define get16bits(d) (*((const uint16_t *) (d)))
        #if !defined (get16bits)
        #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
                  +(uint32_t)(((const uint8_t *)(d))[0]) )
        #endif

我知道你可能会替换 uint32_t ,它用 UInt32 将其他类型更改为 c# 等效,但是如何将上述方法设为静态方法。这会是最好的方法吗?

鲍勃。

【问题讨论】:

  • 对于我们这些精通C#但不会C的人,请描述一下这是做什么的。也很有帮助:您将在其中使用它的上下文。
  • 它所做的就是:d &amp; 0xFFFF。它只是通过转换指针和其他类型来实现。我不知道为什么。
  • 像这样的 C 代码(甚至不是那么迟钝!)让我很高兴他们没有在 C# 中包含#define 宏。 :)
  • d&0xffff 是正确的。此外,该宏有一个错误 - 它不能在小端和大端机器之间移植。
  • @Yoopergeek:你不需要宏来编写复杂的代码。

标签: c# c c-preprocessor


【解决方案1】:

我不知道您为什么要检查 get16bits 是否在定义后立即定义,因为它不会是的唯一方法是会停止编译的预处理器错误。

现在,就是说,这就是你如何将这个可怕的宏翻译成 C# 的方法:

aNumber & 0xFFFF;

事实上,下面是将该宏转换为 C 的方法:

a_number & 0xFFFF;

您不需要所有这些转换魔法来获取数字的低 16 位。这里有更多的 C 定义来告诉你我在说什么:

#define   getbyte(d)     (d & 0xFF)
#define   getword(d)     (d & 0xFFFF)
#define   getdword(d)    (d & 0xFFFFFFFF)
#define   gethighword(d) ((d & 0xFFFF0000) >> 16)
#define   gethighbyte(d) ((d & 0xFF00) >> 8)

你真的在生产代码中使用过那个宏吗?

【讨论】:

  • 嗨,Jed,它们是由 C 语言中的哈希函数调用的。我从来没有写过它,但我想用它作为 c#
  • 那些宏让我读完后要洗手。你将什么移植到 C#?也许它已经完成了。
  • 大声笑,我觉得它们也有点时髦。它没有被任何人转换为C。我最初创建了一个 C# 到 C 互操作调用,但我最终会得到一个很小的 ​​dll 来照顾,所以我想我会将它转换为 C#。
【解决方案2】:

在 C# 中获取整数的低 16 位非常容易:

int x = 0x12345678;
short y = (short)x; // gets 0x5678

如果你想要一个静态方法来做这件事,也很简单:

public static short Get16Bits(int value) {
   return (short)value;
}

【讨论】:

  • 我能问一下为什么你会遇到麻烦而不是使用直接逻辑(这可能要便宜得多)吗?
  • @Jed:选角有什么让你觉得麻烦的地方?出于好奇,我在演员表和 & 操作之间进行了性能测试,演员表并没有贵多少。实际上在性能上完全没有区别。
  • @Guffa:我猜只是不同的观点——来自 C 世界,我希望强制转换会导致对象被分配、初始化并赋予值(而不是可能用于逻辑的单时钟指令)。我只是好奇。
猜你喜欢
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多