请参阅下面的小代码:
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在函数中定义变量,那么我该怎么办呢?
答案 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)
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();