4

可以这样做:

case WM_COMMAND:
if (WORD wNotifyCode = HIWORD(wparam))
{
  ...
}

可以这样做:

case WM_COMMAND:
{
  WORD wNotifyCode = HIWORD(wparam);
  if (wNotifyCode > 1) {
    ...
  }
}

但是不能这样做:

case WM_COMMAND:
if ((WORD wNotifyCode = HIWORD(wparam)) > 1)
{
  ...
}

我认为在这里使用 for 语句会产生误导:

case WM_COMMAND:
for (WORD wNotifyCode = HIWORD(wparam); wNotifyCode > 1; wNotifyCode = 0)
{
  ...
}

因为它看起来很像一个循环正在发生 - 而追随我的可怜的笨蛋必须破译这些垃圾。

但是,有没有一种语法结构可以将包含局部变量声明的 if 语句的优雅与测试其值是否为零的能力相结合?

4

6 回答 6

3

有时可读性和可维护性比保存一行代码更重要。

如果您根本需要局部变量,那么在这种情况下一定要明确地引入它,如果您希望它受到限制,可能会引入一个额外的范围 - 但您还应该考虑是否可以在几个地方使用 HIWORD 宏- 这样你就不需要任何技巧了。

于 2010-02-05T20:13:56.833 回答
1

预处理器技巧:

#define IF_2(init, test) \
    for (bool first_ = true; first_;) for (init; first_ && (test); first_ = false)

IF_2(WORD wNotifyCode = HIWORD(wparam), wNotifyCode > 1)
{
  ...
}

它很丑陋,当然也不比您已有的选择更好。

于 2010-02-05T19:53:56.470 回答
1

尝试引入这样的辅助函数:

template <typename T>
T zeroIfLess(T val, T base)
{
  return val < base ? T(0) : val;
}

然后,将您的条件写为:

if (WORD wNotifyCode = zeroIfLess(HIWORD(wparam), 2))

如果第一个提供的值小于第二个,那将返回零 - 或者,如果您愿意,返回false ;否则返回值。鉴于很难确定函数的名称,以及它是否应该采用包含或排除的最小值,它在这里工作并不会减少它是一个奇怪的 hack。

就像其他人推荐的那样,我也赞成您在“并且可以做到这一点”之后的第一个建议——单独的声明和初始化语句,然后是条件语句。我认为这只是在 C++ 中实现它的自然方式。

于 2010-02-05T20:58:01.550 回答
1

提示:您可以使用消息破解器宏;这样,您将获得更短的 wndproc(没有所有那些嵌套开关),您的消息处理代码将整齐地拆分为单独的函数(每条消息一个),并且您几乎不需要所有 HIWORD-LOWORD东西,因为消息破解宏会为您执行此操作,并将 lParam 和 wParam 检索到的信息传递给您已经拆分为参数的函数。

于 2010-02-05T21:11:51.993 回答
-2

您可以稍微修改一下测试:

if (WORD wNotifyCode = HIWORD(wparam) - 1)

如果你想检查是否wNotifyCode > 1

于 2010-02-05T19:45:46.520 回答
-2

以下对我有用

if (WORD nNotifyCode = HIWORD(test) > 1)
{
}

我会冒险猜测,但不确定 = 运算符优先于 > 运算符,我知道赋值操作的结果是赋值的值,测试有效。

编辑:[戴上傻帽,去角落]

于 2010-02-05T19:49:30.993 回答