【问题标题】:C++ What is this simple macro doing?C++ 这个简单的宏在做什么?
【发布时间】:2011-03-18 22:03:04
【问题描述】:

我正在用 C# 转换一个 C++ 应用程序,并设法完成大部分工作。但是我坚持以下陈述:

#define GET_SHCALL_ID(L)                           (((L) >> 24) & 0x000000FF)

它被应用程序的另一部分调用,它接收到一个窗口消息并将lParam传递给这个调用,如下所示:

// We perform and event handling to display state as required here..
LRESULT CShockSampleDlg::OnShockCallEvent(WPARAM wParam, LPARAM lParam)
{
  // Pass events here so that they will be displayed int the m_LogMessages window.
  OnDebugCallEvents(wParam, lParam);

  UINT callID = GET_SHCALL_ID(lParam);
  UINT chanID = GET_SHCHAN_ID(lParam);
  UINT info   = GET_SHCHAN_INFO(lParam);

所以我的问题是:

  • 宏/方法在做什么?
  • C# 中的等价物是什么?

【问题讨论】:

    标签: c# c++ macros messaging


    【解决方案1】:

    考虑 32 位整数由 4 个八位字节(字节)组成:

      zzyyxxww
    0x12345678
    

    该操作提取“zz”(0x12)字节。

    但这只是实现。用法清楚地写在名称 GET_SHCALL_ID 中 — 它 get 是来自 @987654322 的 shock call ID @。

    C# 和 C++ 共享许多运算符,在这种情况下功能是一样的。

    uint GET_SHCALL_ID(uint lParam) { return (lParam >> 24) & 0xFF; }
    

    【讨论】:

    • & 0x000000FF 有什么用?似乎是(L) >> 24 足以提取zz 字节。
    • @zilgo: (1) LPARAM 可能是 64 位整数而不是 32 位整数。 (2) LPARAM 有可能是有符号的而不是无符号的。
    • @zilgo:右移运算符传播有符号值的符号位,因此 & 0x000000FF 部分确保宏在有符号和无符号值上都能正常工作。
    【解决方案2】:

    它采用 32 位值的最高有效 8 位,例如,0x12345678 变为 0x12

    通常,lParam 会携带一些信息,这就是其中之一。看起来这是冲击呼叫标识符,其他两个宏将从 lParam 中获取不同的位用于其他目的(频道 ID 和频道信息)。

    C# 类似于:

    uint lParam = 0x12345678;            // for testing.
    uint callID = (lParam >> 24) & 0xff;
    uint chanID = ...;                   // These depend on where the
    uint info   = ...;                   // other bits are in lParam.
    

    从技术上讲,这种情况下不需要& 0xff,但如果lParam 恰好是有符号整数(因为负数是符号扩展的)或大于32 位的值(这不太可能),则需要。

    【讨论】:

      【解决方案3】:

      在 C# 中也是如此,但没有宏:

      int 结果 = ( n >> 24 ) & 0xFF;

      【讨论】:

        【解决方案4】:

        这是将 L 的位值向右移动 24 位,(我不知道 LPARAM 是什么/它有多长,所以我不能告诉你剩下的是什么),然后它是按位的将值与 0xFF 进行 AND 运算,从而只保留变量剩余的 8 位值。

        【讨论】:

          猜你喜欢
          • 2022-07-21
          • 2012-03-07
          • 2016-01-15
          • 1970-01-01
          • 2014-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-19
          相关资源
          最近更新 更多