C++这个简单的宏在做什么?

Pet*_*ger 1 c# c++ macros messaging

我正在用C#转换一个C++应用程序,并设法通过大部分工作.但是我坚持以下声明:

#define GET_SHCALL_ID(L)                           (((L) >> 24) & 0x000000FF)
Run Code Online (Sandbox Code Playgroud)

它由应用程序的另一部分调用,它接收一个Window消息,并将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);
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

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

ken*_*ytm 5

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

  zzyyxxww
0x12345678
Run Code Online (Sandbox Code Playgroud)

该操作提取"zz"(0x12)字节.

但那只是实施.用法显然是写在名字GET_SHCALL_ID -它获得 S中的SH玉珠呼叫 IDlParam.

C#和C++共享许多运算符,在这种情况下函数是一样的.

uint GET_SHCALL_ID(uint lParam) { return (lParam >> 24) & 0xFF; }
Run Code Online (Sandbox Code Playgroud)

  • 什么是'&0x000000FF`部分?似乎是`(L)>> 24`足以提取`zz`字节. (2认同)
  • @zilgo:(1)`LPARAM`可能是64位整数而不是32位.(2)有可能`LPARAM`被签名而不是无符号. (2认同)