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

时间:2010-07-21 10:37:53

标签: c# c++ macros messaging

我正在用C#转换一个C ++应用程序,并且通过大部分工作来管理我的工作。但是我坚持以下声明:

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

它由应用程序的另一部分调用,它接收一个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);

所以我的问题是:

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

4 个答案:

答案 0 :(得分:5)

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

  zzyyxxww
0x12345678

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

但那只是实施。用法清楚地写在名称GET_SHCALL_ID中 - 得到 s来自{{b> sh ock 来电 ID 1}}。

C#和C ++共享许多运算符,在这种情况下函数是相同的。

lParam

答案 1 :(得分:1)

它取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碰巧是带符号的int(因为负号是符号扩展的)或大于32位的值(不太可能)。

答案 2 :(得分:0)

在C#中,这是相同的,但没有宏:

int result =(n>> 24)&为0xFF;

答案 3 :(得分:0)

这是将L的位值向右移位24位(我不知道LPARAM是什么/它有多长,所以我不能告诉你剩下的是什么),然后它是逐位的使用0xFF对该值进行AND运算,以便仅保留变量的剩余8位值。