通过if else定义函数的变量

时间:2013-04-01 00:03:56

标签: c++ visual-c++ variables definition

请参阅下面的小代码:

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

5 个答案:

答案 0 :(得分:4)

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

int plusY在if语句

中的}处停止存在 括号int plusY中的{p> {}与外部int plusY的变量不同。

你应该这样做

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

答案 1 :(得分:2)

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

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

将生成plusY,其范围在if之后结束。

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

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

由于对单一内容的限制 表达,并不总是可以这样做,但每当你 可以,它会产生更易读的代码。

答案 2 :(得分:1)

在if语句的右括号中,

plusY从内存中被破坏。如果你需要在if语句之后使用它,那么你应该在块外面声明它:

int plusY;

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

答案 3 :(得分: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();}

P.S。另外,您应该了解典型的代码格式化实践和约定。

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

答案 4 :(得分:1)

您可以使用此一行替换整个if / else(修订了范围规则)。

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