как из блока if передать значение переменной в блок else в С/С++

Мне нужно из блока if передать правильное значение переменной backup_dir в блок else. Если просто написать эту переменную в блоке else то она будет пуста, я думаю всем понятно почему. Так вот как это сделать? Наверняка необходимо использовать указатели или же ссылки, я пробовал, но у меня не получилось.

 if (handle != INVALID_HANDLE_VALUE)
{
    do
    {
        if (strcmp(".", fd.cFileName) != 0 && strcmp("..", fd.cFileName) != 0)
        {
            if (fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
            {
                char res[MAX_PATH] = { '\0' };
                sprintf(backup_dir, "%s\\%s", "bin\\backup", fd.cFileName);
                CreateDirectory(backup_dir, NULL);
                fast_move_files(res, path_for_dir);
            }
            else
            {
                sprintf(backup, "%s\\%s", "bin\\backup", fd.cFileName);
                printf("back-up path %s\n", backup);
                std::ofstream f(backup, std::ios::app);
            }
        }
    } while (FindNextFile(handle, &fd));

Ответы (1 шт):

Автор решения: Zhihar

во-первых у каждой переменной есть область видимости, т.е. откуда к ней можно обратиться

к переменной, определённой внутри скобок {...} можно обратиться только внутри этих же скобок (всякую экзотику не рассматриваем),

поэтому когда вы переменную определили в блоке else - то это именно переменная в блоке else и к другим переменным выше отношения не имеет

поэтому чтобы иметь доступ к переменной и из if блока и из else ее надо определить выше

        char backup_dir[MAX_PATH];
        if (fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
        {
            // backup_dir видна и тут
        }
        else
        {
            // backup_dir видна и тут
        }

А во вторых и это более важно - если ваше условие истинно, то вы входите только в if {...} и не входите (не будет выполняться) в else {...}

так что если вы что-то записали в одном блоке, во втором вы этим не сможете воспользоваться потому что просто сам блок не будет выполняться - только один или другой блог (дудочка и кувшинчик :))

Возможно вы хотите как-то использовать переменную backup_dir внутри цикла while, тогда ее надо поднять еще выше:

char backup_dir[MAX_PATH];
do
{
    if (strcmp(".", fd.cFileName) != 0 && strcmp("..", fd.cFileName) != 0)
    {
        if (fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
        {
            // если backup_dir была изменена тут
        }
        else
        {
            // но в одном из этапов цикла `while` backup_dir можно использовать и тут
            // только надо проверить, что переменная содержит значение, ведь это условие может сработать раньше, чем условие выше, где переменной присваивается значение и создаётся папка
        }
    }
} while (FindNextFile(handle, &fd));
→ Ссылка