代码之家  ›  专栏  ›  技术社区  ›  Sathish Guru V

分析此表达式!

c++
  •  0
  • Sathish Guru V  · 技术社区  · 15 年前

    有人能帮我分析下面这个表达式吗

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

    我应用了流行的左右规则来解决问题,但不能……:(

    谢谢大家:)

    5 回复  |  直到 15 年前
        1
  •  5
  •   Ned Batchelder    15 年前

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

    &(x) -X的地址…

    (int *)&(x) -…解释为指向int的指针

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

        2
  •  10
  •   unwind    15 年前

    这只是第一个 sizeof (int) 参数地址处的字节,并以整数形式返回。

        3
  •  4
  •   user257111    15 年前

    你需要从内到外思考:

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

    像这样的, int y = Mask(something); 返回的整数解释 something .

        4
  •  4
  •   David Rodríguez - dribeas    15 年前

    保持简单:

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

    我假设没有 const_cast 也就是说,这个论点 x 是非常量类型,否则将有一个额外的 康斯特卡斯特 在那里。

        5
  •  2
  •   Coincoin    15 年前

    这种宏可以 float 对A的价值 DWORD 它是二进制形式,反之亦然。这可用于具有函数的库,使用 双字 作为一般输入类型。

    一个例子是 SetRenderState() 在DirectX中:

    HRESULT SetRenderState(
      D3DRENDERSTATETYPE state,
      DWORD value
    );
    

    在这种情况下,有些 state 要求你给 浮动 价值。现在,试着通过 6.78f 直接到该函数将截断 678F 到一个整数 6 . 我们要的是二进制形式 0x40D8F5C3 这样图书馆就可以把它 678F .

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