通过if-else定义函数中的变量



请参阅下面的小代码:

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定义函数中的变量,那么我该怎么做呢?

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

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

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

你应该做这个

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

if的一个分支中定义的变量具有仅限于该分支的范围。即使你去掉了牙套(这在这里是合法的(:

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

将产生其作用域在CCD_ 10之后结束的CCD_。

最好的处理方法是:

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

因为你可以在一个单一的表达,这并不总是可能的,但无论何时可以,它会产生可读性更强的代码。

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

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

您的整个if/else都可以用这一行替换(使用固定的作用域规则(。

int plusY = (FullScreenCheck() == 1) ? getmidY() + 8.0f : getmidY();
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();}

附言一句,您应该了解典型的代码格式化实践和约定。

p.p.s.您还应该将plusY初始化为一个无效的值,这样您就可以轻松地跟踪任何问题。或者,您可以使用三元运算符来完全避免这个问题。在这种情况下,三元算子很可能是最好的解决方案。

最新更新