解析这个表达!

时间:2010-09-08 14:02:03

标签: c++

任何人都可以为我解析以下表达式

#define Mask(x) (*((int *)&(x)))

我应用了流行的左右规则来解决但不能...... :(

感谢一大堆:)

5 个答案:

答案 0 :(得分:10)

这只是读出参数地址的第一个sizeof (int)字节,并将它们作为整数返回。

答案 1 :(得分:5)

这定义了一个宏Mask,它将其参数解释为int。

&(x) - x的地址......

(int *)&(x) - ...被解释为指向int

的指针

*((int *)&(x)) - 该指针的值

答案 2 :(得分:4)

你需要从内到外思考:

  • 找到x。
  • 的地址
  • 将其转换为整数指针
  • 取消引用此指针以返回值。

因此,int y = Mask(something);返回something的整数解释。

答案 3 :(得分:4)

为了简单起见:

#define Mask(x) reinterpret_cast<int&>(x)

我假设没有const_cast,即参数x是非const类型,否则会有额外的const_cast

答案 4 :(得分:2)

这种宏可以将float值转换为DWORD的二进制形式,反之亦然。这可以与具有使用DWORD作为通用输入类型的函数的库一起使用。

一个例子是DirectX中的SetRenderState()

HRESULT SetRenderState(
  D3DRENDERSTATETYPE state,
  DWORD value
);

在这种特殊情况下,某些state要求您提供float值。现在,尝试将6.78f直接传递给该函数会将6.78f截断为6的整数。我们想要的是二进制形式0x40D8F5C3,以便库能够将其强制转换回6.78f

这就是我们所说的重新诠释。除非你知道自己在做什么,否则它依赖于平台并具有潜在的危险性。