Пожалуйста, смотрите маленький код ниже:
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
перестает существовать на }
в обоих, если заявления
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();
приведет к plusY
чья сфера заканчивается после if
,
Лучший способ справиться с этим:
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
на значение, которое в противном случае является недействительным, так что вы можете легко отследить любые проблемы. Кроме того, вы можете использовать троичный оператор, чтобы полностью избежать этой проблемы. В этой ситуации троичный оператор, скорее всего, является лучшим решением.