任何人都可以为我解析以下表达式
#define Mask(x) (*((int *)&(x)))
我应用了流行的左右规则来解决但不能...... :(
感谢一大堆:)
答案 0 :(得分:10)
这只是读出参数地址的第一个sizeof (int)
字节,并将它们作为整数返回。
答案 1 :(得分:5)
这定义了一个宏Mask,它将其参数解释为int。
&(x)
- x的地址......
(int *)&(x)
- ...被解释为指向int
*((int *)&(x))
- 该指针的值
答案 2 :(得分:4)
你需要从内到外思考:
因此,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
。
这就是我们所说的重新诠释。除非你知道自己在做什么,否则它依赖于平台并具有潜在的危险性。