0

请看下面的小代码:

void TestPluginAPI::MouseMove(int nX, int nY)
{
    INPUT input;
    DOUBLE fScreenWidth = GetSystemMetrics( SM_CXSCREEN )-1; 
    DOUBLE fScreenHeight  = GetSystemMetrics( SM_CYSCREEN )-1; 
    int plusY;
    if (FullScreenCheck() == 1) {int plusY = getmidY() + 8.0f;}
    else {int plusY = getmidY();}
    int plusX = getmidX();
    DOUBLE fX = plusX*(65535.0f/fScreenWidth) + (nX*(65535.0f/fScreenWidth));
    DOUBLE fY = plusY*(65535.0f/fScreenHeight) + (nY*(65535.0f/fScreenHeight));

    RtlZeroMemory(&input, sizeof(input));
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;
    input.mi.dx = (LONG)fX;
    input.mi.dy = (LONG)fY;

    SendInput(1, &input, sizeof(input));
}

问题是编译器给了我一个plusY未定义的警告,显然如果我尝试在已编译的插件中运行此函数(它来自插件代码,通过浏览器中的 javascript 控制台调试它)它会崩溃,因为plusY未定义。

看来如果我不能通过if-else在函数中定义变量,那我该怎么做呢?

4

5 回答 5

4
{int plusY = getmidY() + 8.0f;}

int plusY}在两个 if 语句中都停止存在

int plusY括号内是与外部{}不同的变量。int plusY

你应该做这个

int plusY;
if (FullScreenCheck() == 1) {plusY = getmidY() + 8.0f;}
else {plusY = getmidY();}
于 2013-04-01T00:04:59.447 回答
2

在一个分支中定义的变量if仅具有该分支的范围。即使您消除了大括号(这在此处是合法的):

if ( fullScreenCheck() == 1 )
    int plusY = getmidY() + 8.0f;
else
    int plusY = getmidY();

将导致 aplusY其范围在if.

处理此问题的最佳方法是:

int plusY = fullScreenCheck() == 1
            ? getmidY() + 8.0f
            : getmidY();

由于您可以在单个表达式中执行的操作受到限制,因此并非总是可以执行此操作,但只要您可以,它就会产生更具可读性的代码。

于 2013-04-01T00:20:24.013 回答
1

plusY在 if 语句的右大括号处从内存中销毁。如果您需要在 if 语句之后使用它,那么您应该在块外声明它:

int plusY;

if (...)
{
    plusY = getmidY() + 8.0f;
}
于 2013-04-01T00:06:39.707 回答
1
int plusY;

您已经声明了一个名为的变量,该变量plusY可用于您的整个函数

if (FullScreenCheck() == 1) {int plusY = getmidY() + 8.0f;}

这声明了另一个变量,它也恰好是命名plusY的,但是这个新变量只在if语句内部可用。

else {int plusY = getmidY();}

现在你声明了第三个同名的变量,它只在else子句中可用。

要解决此问题并在所有位置使用相同的变量,请将您的代码更改为

int plusY;
if (FullScreenCheck() == 1) {plusY = getmidY() + 8.0f;}
else {plusY = getmidY();}

ps 顺便说一句,您应该了解典型的代码格式化实践和约定。

pps 您还应该初始化plusY一个无效的值,以便您可以轻松追踪任何问题。或者,您可以使用三元运算符来完全避免此问题。在这种情况下,三元运算符很可能是最好的解决方案。

于 2013-04-01T00:06:41.767 回答
1

您的整个if/else可以用这一行替换(固定范围规则)。

int plusY = (FullScreenCheck() == 1) ? getmidY() + 8.0f : getmidY();
于 2013-04-01T00:14:52.567 回答